Laravel Dimana Di Dimana Memiliki

Apakah ada cara untuk mengembalikan model induk dengan suatu hubungan tetapi hanya mengembalikan beberapa baris hubungan dengan menggunakan di mana?

Itu mungkin cukup membingungkan, izinkan saya menjelaskannya.

Saat ini saya mempunyai 2 model, Gedung dan ruangan, 1 gedung bisa mempunyai banyak ruangan.

Saya ingin dapat meneruskan array id ruangan, dan mengembalikan situs dan hanya ruangan yang ada di array.

Inilah yang saya miliki saat ini

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

Saat ini ini akan mengembalikan semua bangunan yang memiliki ruangan yang idnya ada di array ids dan semua ruangannya, yang pada akhirnya mengembalikan bangunan dengan 200+ kamar. Saya membutuhkannya untuk mengembalikan gedung dan HANYA kamar yang memiliki id dalam array itu.

Apakah ini mungkin?

Saya tahu saya bisa melakukannya dengan cara terbalik dan mendapatkan semua ruangan sebagai induk lalu mendapatkan bangunannya, tetapi saya memerlukan bangunan untuk menjadi induk karena saya menjalankan penelitian seperti ini dengan hasilnya

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

Jika itu masih membingungkan, skenario dunia nyata adalah saya membuat PDF ruangan. Kamar dapat dipilih dengan mencentang kotak di sebelah kamar dalam daftar kamar. Saya kemudian harus bisa melewati array id ruangan, dan mendapatkan semua bangunan yang berisi salah satu ruangan. Kemudian dapatkan semua ruangan untuk setiap bangunan tempat id ruangan berada dalam array.


person S_R    schedule 10.09.2018    source sumber


Jawaban (4)


Pertama yang perlu Anda ketahui, whereHas hanya memfilter hasil induk Anda tetapi bukan relasi pemuatan yang bersemangat. Jadi, Anda perlu menerapkan filter itu dalam pemuatan yang bersemangat juga. Seperti ini

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

Di sini whereHas memfilter bangunan dan menggunakan with ruang filter.

person rkj    schedule 10.09.2018
comment
Cemerlang, ini sangat masuk akal! Terima kasih - 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();

semoga ini bisa membantu Anda.

person syam    schedule 10.09.2018

Anda dapat melakukannya dengan kode berikut:

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

Semoga ini membantu.

person jogesh_pi    schedule 10.09.2018
comment
Ini tidak berhasil, ini masih mengembalikan setiap ruangan untuk situs, asalkan situs tersebut memiliki ruangan dengan id yang ada di dalam array - person S_R; 10.09.2018

Anda dapat dengan bersemangat memuat relasi anak dan mengeluarkan bangunan dari koleksi ruangan:

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

Agar ini berfungsi, Anda perlu mendeklarasikan relasi dalam model Gedung dan Ruangan.

person Thiago Barcala    schedule 10.09.2018
comment
Karena saya perlu melakukan foreach pada gedung-gedung tersebut, kemudian melakukan foreach pada setiap ruangan di dalam gedung. Bangunan harus menjadi relasi induk - person S_R; 10.09.2018
comment
Salah satu jawaban lain telah memecahkan masalah saya, terima kasih atas bantuan dan saran Anda! - person S_R; 10.09.2018