Perhatikan bahwa cara Anda mencoba melakukannya, Anda mungkin mendapatkan beberapa baris per item (sekali per daftar terkait). Cara yang lebih baik adalah dengan memiliki daftar daftar per item.
Jika Anda menggunakan model fasih dan Anda telah mengatur hubungan dengan benar, Anda dapat mencoba yang berikut ini:
$cats = [1, 2, 3];
$query = Item::with('listings');
foreach ($cats as $cat) {
$query->whereHas('catitems', function($q) use($cat) {
$q->where('id', $cat);
});
}
$items = $query->get();
Sekarang setiap item harus memiliki listings
Properti. Misalnya untuk item pertama Anda dapat mengakses listingan dengan cara berikut:
$item1 = $items[0];
$listings1 = $item1->listings;
Perhatikan bahwa whereHas()
mungkin akan membuat EXISTS
yang berkorelasi subquery untuk setiap entri di $cats
Himpunan. Jika itu lambat, Anda dapat menggunakan kueri GABUNG seperti:
$items = Item::with('listings')
->join('catitem_item', 'catitem_item.item_id', '=', 'items.id')
->whereIn('catitem_item.catitem_id', $cats)
->groupBy('items.id')
->having(DB::raw('count(*)'), '=', count($cats))
->select('items.*')
->get();
Jika Anda tidak menggunakan fasih, Anda juga dapat melakukan "pemuatan bersemangat" sendiri.
$items = DB::table('items')
->join('catitem_item', 'catitem_item.item_id', '=', 'items.id')
->whereIn('catitem_item.catitem_id', $cats)
->groupBy('items.id')
->having(DB::raw('count(*)'), '=', count($cats))
->select('items.*')
->get()
->keyBy('id');
foreach ($items as $item) {
$item->listings = [];
}
$itemIds = $items->pluck('id');
$listings = DB::table('listings')
->join('item_listing', 'item_listing.listing_id', '=', 'listings.id')
->whereIn('item_listing.item_id', $itemIds)
->groupBy('listings.id')
->select('listings.*', DB::raw('group_concat(item_listing.item_id) as item_ids'))
->get();
foreach ($listings as $listing) {
$itemIds = explode(',', $listing->item_ids);
foreach ($itemIds as $itemId) {
$items[$itemId]->listings[] = $listing;
}
$listing->forget('item_ids');
}