Laravel อยู่ที่ไหนเมื่อมีที่ไหน

มีวิธีใดบ้างที่จะส่งคืนโมเดลพาเรนต์ที่มีความสัมพันธ์ แต่ส่งคืนแถวความสัมพันธ์เพียงบางแถวโดยใช้ Where in เท่านั้น

นั่นอาจจะค่อนข้างสับสน ให้ฉันอธิบาย

ตอนนี้ผมมี 2 แบบครับ ตึกและห้อง 1 ตึกมีหลายห้องครับ

ฉันต้องการให้ส่งผ่านรหัสห้องหลายชุด และส่งคืนไซต์และเฉพาะห้องที่อยู่ในอาร์เรย์

นี่คือสิ่งที่ฉันมีในขณะนี้

if($request->input('ids') && !is_null($request->input('ids'))){
    $ids = explode(',',$request->input('ids'));

    //Exploded ids looks like this    "2,4,11,55,56"

    $buildings = Buildings::join('rooms')->whereIn('rooms.id',$ids)->get();
} else {
    $buildings = Buildings::whereHas('rooms')->get();
}

ในขณะนี้ สิ่งนี้จะส่งคืนอาคารทั้งหมดที่มีห้องซึ่ง id อยู่ในอาร์เรย์ ids และห้องทั้งหมดในห้องนั้น ซึ่งสุดท้ายจะส่งคืนอาคารที่มีห้องมากกว่า 200 ห้อง ฉันต้องการมันเพื่อคืนอาคารและเฉพาะห้องที่มีรหัสในอาร์เรย์นั้นเท่านั้น

เป็นไปได้ไหม?

ฉันรู้ว่าฉันทำแบบผกผันได้ และได้ทุกห้องเมื่อผู้ปกครองได้อาคาร แต่ฉันต้องการอาคารที่เป็นผู้ปกครองในขณะที่ฉันกำลังดำเนินการแบบนี้พร้อมผลลัพธ์

foreach($buildings as $key => $building){
    <h1>{{$building->name}}</h1>
    foreach($building->rooms as $k => $room){
      <p>{{$room->name}}</p>
    }
}

ในกรณีที่ยังสับสนอยู่ สถานการณ์จริงคือฉันกำลังสร้างห้องในรูปแบบ PDF สามารถเลือกห้องได้โดยทำเครื่องหมายที่ช่องถัดจากห้องในรายการห้อง จากนั้น ฉันจะต้องสามารถส่งผ่านอาร์เรย์ของรหัสห้อง และรับอาคารทั้งหมดที่มีห้องใดห้องหนึ่งได้ จากนั้นรับห้องทั้งหมดสำหรับแต่ละอาคารที่มีรหัสห้องอยู่ในอาร์เรย์


person S_R    schedule 10.09.2018    source แหล่งที่มา


คำตอบ (4)


ก่อนอื่นคุณต้องรู้ whereHas กรองเฉพาะผลลัพธ์หลักของคุณเท่านั้น ไม่ใช่กรองความสัมพันธ์ในการโหลดอย่างกระตือรือร้น ดังนั้นคุณต้องใช้ตัวกรองนั้นในการโหลดที่กระตือรือร้นด้วย แบบนี้

$ids = explode(',',$request->input('ids'));
$buildings = Buildings::with(['rooms' => function($q) use ($ids) {
    $q->whereIn('id', $ids);
}])->whereHas('rooms', function($q) use ($ids) {
    $q->whereIn('id', $ids);
})->get();

ที่นี่ whereHas กรองอาคารและการใช้ with ห้องกรอง

person rkj    schedule 10.09.2018
comment
ยอดเยี่ยม มันสมเหตุสมผลดี! ขอบคุณ - person S_R; 10.09.2018

$ids = explode(',',$request->input('ids'));
$building_ids = Room::whereIn('id',$ids)->pluck('building_id');
$buildings_with_specific_rooms = Building::join('rooms', 'buildings.id', '=', 'rooms.building_id')->select('buildings.name', 'rooms.name')->whereIn('buildings.id', $building_ids)->whereIn('rooms.id', $ids)->get();

หวังว่านี่จะช่วยคุณได้

person syam    schedule 10.09.2018

คุณสามารถทำได้ด้วยรหัสต่อไปนี้:

$ids = explode(',',$request->input('ids'));
$buildings = Buildings::whereHas('rooms', function($q) use ($ids) {
    $q->whereIn('id', $ids);
})->get();

หวังว่านี่จะช่วยได้

person jogesh_pi    schedule 10.09.2018
comment
สิ่งนี้ใช้งานไม่ได้ แต่ยังคงส่งคืนทุกห้องสำหรับไซต์ โดยที่ไซต์นั้นมีห้องที่มีรหัสอยู่ในอาร์เรย์ - person S_R; 10.09.2018

คุณสามารถโหลดความสัมพันธ์เด็กและนำอาคารออกจากคอลเลคชันห้องได้:

$buildings = Room::with('building')
    ->with('building.room')
    ->whereIn('id', $ids)
    ->get()
    ->pluck('building');

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

person Thiago Barcala    schedule 10.09.2018
comment
เพราะฉันต้องเรียกใช้ foreach บนอาคาร จากนั้นจึง foreach ในแต่ละห้องในอาคาร อาคารจะต้องเป็นความสัมพันธ์ระหว่างผู้ปกครอง - person S_R; 10.09.2018
comment
คำตอบอื่นช่วยแก้ปัญหาของฉันได้ ขอบคุณสำหรับความช่วยเหลือและข้อเสนอแนะของคุณ! - person S_R; 10.09.2018