Rumah  >  Soal Jawab  >  teks badan

Tingkatkan model pengguna

Saya cuba memanjangkan model Pengguna dengan jadual lain (Profil) untuk mendapatkan gambar profil, lokasi, dsb.

Bolehkah saya mengatasi fungsi index() model Pengguna untuk melakukan ini?

Kod model semasa:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    protected $fillable = [
        'name',
        'email',
        'password',
        'user_group'
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

P粉311464935P粉311464935306 hari yang lalu325

membalas semua(1)saya akan balas

  • P粉378890106

    P粉3788901062024-01-11 15:21:01

    Apa yang anda mahu lakukan adalah dalam User 模型和新的Profile 模型之间建立关系。为此,您首先需要创建一个模型 Profile 及其关联的 Tabble profiles

    php artisan make:model Profile --migration

    Fail dalam databasemigrations中应该有一个名为2022_11_28_223831_create_profiles_table.php

    Sekarang anda perlu menambah kunci asing untuk menunjukkan pengguna yang mempunyai profil ini.

    public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->id();
            // $table->string('path_to_picture')
            // user id
            $table->foreignId('user_id')->constrained()->onDelete('cascade');
            $table->timestamps();
        });
    }

    Sekarang tambah fungsi berikut dalam model pengguna anda

    public function profile()
    {
        return $this->hasOne(Profile::class);
    }

    Dalam model profil anda

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    Larikanphp artisan migrate dan semuanya harus berfungsi seperti yang diharapkan

    Jika anda ingin menguji sama ada hubungan itu berfungsi seperti yang diharapkan, buat kes ujian baharu

    php artisan make:test ProfileUserRelationTest

    di testsFeatureProfileUserRelationTest.php

    <?php
    
    namespace Tests\Feature;
    
    use Illuminate\Foundation\Testing\RefreshDatabase;
    use Illuminate\Foundation\Testing\WithFaker;
    use Tests\TestCase;
    use App\Models\User;
    use App\Models\Profile;
    use Illuminate\Support\Facades\Hash;
    
    class ProfileUserRelationTest extends TestCase
    {
        use RefreshDatabase;
        public function test_the_relation_between_user_and_profile_works()
        {
            $user = User::create([
                'name' => 'John Doe',
                'email' => 'jd@example.com',
                'password' => Hash::make('password'),
            ]);
            $profile = new Profile();
            $profile->user_id = $user->id;
            $profile->save();
    
            $this->assertEquals($user->id, $profile->user->id);
            $this->assertEquals($user->name, $profile->user->name);
            $this->assertEquals($profile->id, $user->profile->id);
        }
    }

    Kini anda boleh berlari php artisan test untuk melihat sama ada semuanya baik-baik saja.

    AwasIni akan menyegarkan pangkalan data anda! Jadi jangan uji dalam pengeluaran.

    Keluaran sepatutnya kelihatan seperti ini

    PASS  Tests\Unit\ExampleTest
      ✓ that true is true
    
       PASS  Tests\Feature\ExampleTest
      ✓ the application returns a successful response
    
       PASS  Tests\Feature\ProfileUserRelationTest
      ✓ the relation between user and profile works
    
      Tests:  3 passed
      Time:   0.35s

    Ketahui lebih lanjut tentang perhubungan dalam Laravel: https://laravel.com/docs/9.x/eloquent-relationships

    Ketahui lebih lanjut tentang migrasi: https://laravel.com/docs/9.x/migrations

    Alternatif

    $user = User::create([
        'name' => 'John Doe',
        'email' => 'jd@example.com',
        'password' => Hash::make('password'),
    ]);
    
    $user->profile()->create(...); // replace the ... with the things you want to insert you dont need to add the user_id since it will automatically added it. It will still work like the one above.

    balas
    0
  • Batalbalas