Laravel Eloquent - Bergabunglah dengan 2 tabel melalui tabel lainnya

Saya membangun hubungan antara 2 tabel hingga tabel ke-3. Saya memiliki total 3 meja.

1.) alamat

Schema::create('addresses', function (Blueprint $table) {
    $table->increments('id');
    $table->text('line_1_number_building')->nullable();
    $table->text('line
Schema::create('staffs', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('staff_category_id');
    $table->integer('gender_id');
    $table->text('staff_job_title')->nullable();
    $table->text('staff_first_name')->nullable();
    $table->text('staff_middle_name')->nullable();
    $table->text('staff_last_name')->nullable();
    $table->text('staff_qualifications')->nullable();
    $table->date('staff_birth_date');
    $table->longText('other_staff_details')->nullable();
    $table->timestamps();
});
number_street')->nullable(); $table->text('line
Schema::create('staff_addresses', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('staff_id');
    $table->integer('address_id');
    $table->date('date_address_from')->nullable();
    $table->date('date_address_to')->nullable();
    $table->timestamps();
});
area_locality')->nullable(); $table->text('city')->nullable(); $table->text('zip_code')->nullable(); $table->text('state_province_county')->nullable(); $table->text('country')->nullable(); $table->longText('other_address_details')->nullable(); $table->timestamps(); });

2.) staf

Schema::create('staffs', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('staff_category_id');
    $table->integer('gender_id');
    $table->text('staff_job_title')->nullable();
    $table->text('staff_first_name')->nullable();
    $table->text('staff_middle_name')->nullable();
    $table->text('staff_last_name')->nullable();
    $table->text('staff_qualifications')->nullable();
    $table->date('staff_birth_date');
    $table->longText('other_staff_details')->nullable();
    $table->timestamps();
});

3.) alamat_staf

Schema::create('staff_addresses', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('staff_id');
    $table->integer('address_id');
    $table->date('date_address_from')->nullable();
    $table->date('date_address_to')->nullable();
    $table->timestamps();
});

Sekarang saya ingin mendapatkan daftar semua alamat untuk setiap entri staf. Saya mencoba kode di bawah ini tetapi ia mengembalikan alamat yang cocok dengan ID ID Staf

Apa yang saya coba

public function saddresses()
{
    return $this->hasManyThrough('App\addresses','App\staff_addresses','staff_id','id');
}

Apa yang saya dapatkan

Address : [{"id":3,"line_1_number_building":"Hasan 2 line 1","line_2_number_street":"Hasan 2 line 2","line_3_area_locality":"Hasan 2 line 3","city":"Hasan 2 city","zip_code":"Hasan 2 zip code","state_province_county":"Hasan 2 state","country":"Hasan 2 country","other_address_details":"Hasan 2 other details","created_at":null,"updated_at":null,"staff_id":5},{"id":4,"line_1_number_building":"Sadiq 2 line 1","line_2_number_street":"Sadiq 2 line 2","line_3_area_locality":"Sadiq 2 line 3","city":"Sadiq 2 city","zip_code":"Sadiq 2 zip code","state_province_county":"Sadiq 2 state","country":"Sadiq 2 country","other_address_details":"Sadiq 2 other details","created_at":null,"updated_at":null,"staff_id":5}] 

Tampilan lebih baik

Bisakah Anda membimbing saya bagaimana saya bisa membangun hubungan yang benar?

Salam, Hasan Rajani.


person Hasan Rajani    schedule 07.11.2018    source sumber
comment
menunjukkan kepada Anda fungsi pengontrol yang fasih   -  person Emtiaz Zahid    schedule 07.11.2018
comment
Dari tabel Anda sepertinya Anda menginginkan hubungan milikToMany.   -  person adam    schedule 07.11.2018


Jawaban (2)


Solusi ini sempurna @Capt. Teemo. Tapi, jika Anda menginginkan alamat untuk satu staf tertentu maka disini saya sudah memberikan solusinya.

Anda harus mendefinisikan fungsi ini dalam Model staf.

public function addresses() { return $this->belongsToMany('App\addresses'); }

Permintaan untuk mendapatkan semua alamat $staffId (di mana $staffId adalah id tabel staf)

$data = Staff::with('addresses')->where('id', $staffId)->first();

Dan juga jika Anda ingin mendapatkan atribut tambahan di tabel pivot, Anda harus menentukannya saat mendefinisikan relasi.

public function addresses() { return $this->belongsToMany('App\addresses')->withPivot('date_address_from', 'date_address_to'); }

Selain itu, Anda dapat mempertahankan kolom Created_at dan Update_at secara otomatis menggunakan metode withTimestamps dalam hubungannya.

Untuk referensi: https://laravel.com/docs/5.7/eloquent-relationships#many-to-many

person Vandit P. Kotadiya    schedule 07.11.2018
comment
Terima kasih Vandit P. Kotadiya atas bantuan dan bimbingan Anda :), Namun saya mendapatkan solusi cepat lainnya untuk masalah saya di situs web ini (laraveldaily.com/pivot-tables-and-many-to-many-relationships) membuat 'alamat' fungsi baru pada Model Staf & kemudian menambahkan nama tabel pivot & menggabungkan nama bidang di bawah sebagai argumen ===› (return $this-›belongsToMany('App\addresses','staff_addresses','staff_id','address_id');) - person Hasan Rajani; 08.11.2018

Pertama, coba perbaiki konvensi penamaan Anda. Segalanya akan jauh lebih mudah jika Anda mengikuti konvensi penamaan laravel. Berikut panduannya.

  • Tabel Pivot harus berupa nama model tunggal dalam urutan abjad (ubah staff_addresses menjadi address_staff)

Kemudian gunakan hubungan belongsToMany.

Model staf:

public function addresses()
{
    return $this->belongsToMany('App\addresses');
}

Inilah cara Anda menanyakan:

$data = Staff::with('addresses')->get();
person Kapitan Teemo    schedule 07.11.2018
comment
Terima kasih Kapten Teemo karena telah membimbing saya dalam konvensi penamaan, Ini akan banyak membantu saya :). Sebenarnya saya sedang belajar laravel dan tidak yakin dengan banyak fungsi dan aturannya. - person Hasan Rajani; 08.11.2018
comment
Untuk masalah saya, menurut saya solusi ini bermanfaat (laraveldaily.com/ tabel pivot-dan-hubungan banyak-ke-banyak) membuat 'alamat' fungsi baru pada Model Staf & kemudian menambahkan nama tabel pivot & menggabungkan nama bidang di bawah sebagai argumen ===› (kembalikan $ini-› milikToMany('Alamat\Aplikasi','alamat_staf','id_staf','id_alamat');) - person Hasan Rajani; 08.11.2018
comment
Jika Anda mengikuti konvensi penamaan laravel, Anda tidak perlu menunjukkan nama tabel dalam relasi Anda yaitu staff_addresses. Laravel secara otomatis mencari address_staff sebagai pivot sejak Anda bergabung dengan tabel addresses dan staffs. Argumen Anda hanyalah return $this->belongsToMany('App\addresses'); - person Kapitan Teemo; 08.11.2018
comment
Ya saya mengerti. Saya mencoba mengubah konvensi penamaan dan melakukan migrasi ulang tetapi hal ini mengacaukan seluruh pengaturan saya, jadi menurut saya bukan ide yang baik untuk mengambil langkah ini pada tahap ini. Namun itu akan membantu saya dalam proyek berikutnya :). Saat ini sedang mempelajari laravel :) dan saya tidak ingin kehilangan minat dengan mengulangi semuanya. Terima kasih atas bantuan Anda - person Hasan Rajani; 09.11.2018