Php 具有连接多个表的雄辩的
我有4个表、项目、列表、catitem_项目和项目列表 项目和列表是多对多关系。 项目和catitems也是多对多关系 catitems包含项目类别的列表。 清单就像物品所在的位置。 示例列出商店A可以有物品椅,物品椅有多个catitem类别 我的目标是获取类别列表下的项目,例如类别1、类别2和类别3(Php 具有连接多个表的雄辩的,php,mysql,laravel,eloquent,laravel-eloquent,Php,Mysql,Laravel,Eloquent,Laravel Eloquent,我有4个表、项目、列表、catitem_项目和项目列表 项目和列表是多对多关系。 项目和catitems也是多对多关系 catitems包含项目类别的列表。 清单就像物品所在的位置。 示例列出商店A可以有物品椅,物品椅有多个catitem类别 我的目标是获取类别列表下的项目,例如类别1、类别2和类别3($cats),以及该项目所在的列表信息。 因此,如果有6个椅子列表,它将返回6个椅子结果 这是我到目前为止提出的问题 $items = DB::table('items')
$cats
),以及该项目所在的列表信息。
因此,如果有6个椅子列表,它将返回6个椅子结果
这是我到目前为止提出的问题
$items = DB::table('items')
->join('catitem_item', 'catitem_item.item_id', '=', 'items.id')
->join('item_listing', 'item_listing.item_id', '=', 'items.id')
->join('listings', 'item_listing.listing_id', '=', 'listings.id')
->whereIn('catitem_item.catitem_id', $cats)
//->groupBy('items.id')
//->having(DB::raw('count(*)'), '=', count($cats))
->select('items.id', 'items.name', 'items.price', 'items.slug', 'item_listing.listing_id', 'listings.name as listing_name', 'listings.slug as listing_slug')
->get();
请注意,按照您尝试的方式,每个项目可能会有多行(每个相关列表一次)。更好的方法是每个项目都有一个列表数组 如果您使用雄辩的模型并且正确设置了关系,您可以尝试以下方法:
$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();
现在每个项目都应该有一个listings
属性。例如,对于第一个项目,您可以通过以下方式访问列表:
$item1 = $items[0];
$listings1 = $item1->listings;
请注意,whereHas()
可能会为$cats
数组中的每个条目创建一个相关的EXISTS
子查询。如果这会减慢速度,您可以使用如下连接查询:
$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();
如果你不使用雄辩,你也可以自己做“渴望加载”
$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');
}
请注意,按照您尝试的方式,每个项目可能会有多行(每个相关列表一次)。更好的方法是每个项目都有一个列表数组 如果您使用雄辩的模型并且正确设置了关系,您可以尝试以下方法:
$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();
现在每个项目都应该有一个listings
属性。例如,对于第一个项目,您可以通过以下方式访问列表:
$item1 = $items[0];
$listings1 = $item1->listings;
请注意,whereHas()
可能会为$cats
数组中的每个条目创建一个相关的EXISTS
子查询。如果这会减慢速度,您可以使用如下连接查询:
$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();
如果你不使用雄辩,你也可以自己做“渴望加载”
$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');
}
什么是laravel版本?它的laravel 5.3你可以发布一个什么是laravel版本?它的laravel 5.3你可以发布一个第一个解决方案是有效的,似乎雄辩的方式更简单。我仍在尝试第二种解决方案。你们能检查一下这个吗,我有一些问题转换成雄辩的方式第一个解决办法是工作,似乎雄辩的方式更简单。我仍在尝试第二种解决方案。你能检查一下吗,我在转换成雄辩的方式时遇到了一些问题