Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 具有连接多个表的雄辩的_Php_Mysql_Laravel_Eloquent_Laravel Eloquent - Fatal编程技术网

Php 具有连接多个表的雄辩的

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')

我有4个表、项目、列表、catitem_项目和项目列表

项目和列表是多对多关系。 项目和catitems也是多对多关系

catitems包含项目类别的列表。 清单就像物品所在的位置。 示例列出商店A可以有物品椅,物品椅有多个catitem类别

我的目标是获取类别列表下的项目,例如类别1、类别2和类别3(
$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你可以发布一个第一个解决方案是有效的,似乎雄辩的方式更简单。我仍在尝试第二种解决方案。你们能检查一下这个吗,我有一些问题转换成雄辩的方式第一个解决办法是工作,似乎雄辩的方式更简单。我仍在尝试第二种解决方案。你能检查一下吗,我在转换成雄辩的方式时遇到了一些问题