Laravel Eloquent - รวม 2 ตารางผ่านตารางอื่น

ฉันสร้างความสัมพันธ์ระหว่าง 2 ตารางถึงตารางที่ 3 ฉันมีโต๊ะทั้งหมด 3 โต๊ะ

1.) ที่อยู่

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.) พนักงาน

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.) พนักงาน_ที่อยู่

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();
});

ตอนนี้ฉันต้องการรับรายการที่อยู่ทั้งหมดสำหรับการเข้าพนักงาน ฉันลองใช้โค้ดด้านล่าง แต่ส่งคืนที่อยู่ที่ตรงกับ ID ของ Staff ID

สิ่งที่ฉันลอง

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

สิ่งที่ฉันได้รับ

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}] 

มุมมองที่ดีขึ้น

คุณช่วยแนะนำฉันหน่อยได้ไหมว่าฉันจะสร้างความสัมพันธ์ที่เหมาะสมได้อย่างไร?

ขอแสดงความนับถือ ฮาซัน ราจานี


person Hasan Rajani    schedule 07.11.2018    source แหล่งที่มา
comment
แสดงฟังก์ชั่นคอนโทรลเลอร์ที่มีฝีปาก   -  person Emtiaz Zahid    schedule 07.11.2018
comment
จากตารางของคุณ ดูเหมือนว่าคุณอาจต้องการความสัมพันธ์ที่เป็นของToMany   -  person adam    schedule 07.11.2018


คำตอบ (2)


โซลูชันนี้สมบูรณ์แบบ @Capt ทีโม. แต่ถ้าคุณต้องการที่อยู่สำหรับพนักงานคนใดคนหนึ่ง ฉันได้จัดเตรียมวิธีแก้ปัญหาไว้ที่นี่แล้ว

คุณต้องกำหนดฟังก์ชันนี้ใน โมเดลพนักงาน

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

แบบสอบถามเพื่อรับที่อยู่ทั้งหมดของ $staffId (โดยที่ $staffId คือ id ของตารางพนักงาน)

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

และหากคุณต้องการรับแอตทริบิวต์เพิ่มเติมในตารางสรุป คุณต้องระบุแอตทริบิวต์เหล่านั้นเมื่อกำหนดความสัมพันธ์

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

นอกจากนี้ คุณยังสามารถรักษาคอลัมน์ create_at และ updated_at ไว้ได้โดยอัตโนมัติโดยใช้เมธอด withTimestamps ในความสัมพันธ์

สำหรับการอ้างอิง: https://laravel.com/docs/5.7/eloquent-relationships#many-to-many

person Vandit P. Kotadiya    schedule 07.11.2018
comment
ขอขอบคุณ Vandit P. Kotadiya สำหรับความช่วยเหลือและคำแนะนำ :) อย่างไรก็ตาม ฉันได้รับวิธีแก้ไขปัญหาอย่างรวดเร็วอีกวิธีหนึ่งบนเว็บไซต์นี้ (laraveldaily.com/pivot-tables-and-many-to-many-relationships) สร้างฟังก์ชันใหม่ 'ที่อยู่' ใน Staff Model แล้วเพิ่มชื่อตาราง Pivot & การเข้าร่วมชื่อฟิลด์ภายใต้อาร์กิวเมนต์ ===› (ส่งคืน $this->belongsToMany('App\addresses','staff_addresses','staff_id','address_id');) - person Hasan Rajani; 08.11.2018

ขั้นแรก ลองแก้ไขรูปแบบการตั้งชื่อของคุณ สิ่งต่างๆ จะง่ายขึ้นมากถ้าคุณทำตามแบบแผนการตั้งชื่อของ laravel นี่คือคำแนะนำ

  • Pivot Tables ควรเป็นชื่อโมเดลเอกพจน์ตามลำดับตัวอักษร (เปลี่ยน staff_addresses เป็น address_staff)

จากนั้นใช้ความสัมพันธ์ belongsToMany

พนักงาน โมเดล:

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

ต่อไปนี้เป็นวิธีค้นหา:

$data = Staff::with('addresses')->get();
person Kapitan Teemo    schedule 07.11.2018
comment
ขอบคุณกัปตัน Teemo ที่แนะนำแนวทางการตั้งชื่อให้ฉัน ซึ่งจะช่วยฉันได้มาก :) จริงๆ แล้วฉันกำลังเรียนรู้ laravel และไม่แน่ใจถึงฟังก์ชันและกฎเกณฑ์มากมาย - person Hasan Rajani; 08.11.2018
comment
สำหรับปัญหาของฉัน ฉันพบว่าวิธีนี้มีประโยชน์ (laraveldaily.com/ pivot-tables-and-many-to-many-relationships) สร้างฟังก์ชันใหม่ 'ที่อยู่' ใน Staff Model จากนั้นเพิ่มชื่อตาราง Pivot & การรวมชื่อฟิลด์ภายใต้อาร์กิวเมนต์ ===› (ส่งคืน $this-› เป็นของToMany('แอป\ที่อยู่','staff_addresses','staff_id','address_id');) - person Hasan Rajani; 08.11.2018
comment
หากคุณปฏิบัติตามหลักการตั้งชื่อ laravel คุณไม่จำเป็นต้องระบุชื่อตารางในความสัมพันธ์ของคุณซึ่งก็คือ staff_addresses Laravel ค้นหา address_staff เป็น pivot โดยอัตโนมัติเนื่องจากคุณเข้าร่วมตาราง addresses และ staffs ข้อโต้แย้งของคุณก็คือ return $this->belongsToMany('App\addresses'); - person Kapitan Teemo; 08.11.2018
comment
ใช่ฉันเข้าใจแล้ว. ฉันพยายามเปลี่ยนรูปแบบการตั้งชื่อและย้ายข้อมูลอีกครั้ง แต่มันทำให้การตั้งค่าทั้งหมดของฉันยุ่งเหยิง ดังนั้นฉันจึงคิดว่าไม่ควรทำตามขั้นตอนนี้ในขั้นตอนนี้ อย่างไรก็ตามมันจะช่วยฉันในโครงการต่อไป :) กำลังเรียนรู้ laravel :) และฉันไม่ต้องการเสียความสนใจด้วยการทำทุกอย่างซ้ำ ขอบคุณสำหรับความช่วยเหลือของคุณ - person Hasan Rajani; 09.11.2018