Laravel 在带有分页的数据透视表中搜索
Posted
技术标签:
【中文标题】Laravel 在带有分页的数据透视表中搜索【英文标题】:Laravel search in pivot table with pagination 【发布时间】:2019-03-09 13:58:33 【问题描述】:我需要搜索演示类型。
注意:我已经隐藏了其他搜索的简洁性。
背景:
表格:
-
用户 [id, name, ...]
演示 [id, name, user_id]
流派 [id, name]
demo_genre(数据透视表)[demo_id,genre_id]
代码
$user = (new User)->newQuery();
$user->with(['demos' =>function($query)
$query->whereHas('genres', function ($query)
$query->whereIn('genre_id',[2,3,4]);
);
]);
$user->paginate();
注意:如果有搜索结果有数据,上述代码有效。但如果在数据透视表中找不到流派,则返回空的 demos 数组。
问题:如何删除与提供的条件不匹配的结果(即:$query->whereIn('genre_id',[2,3,4]);
)。并展示符合条件的demo。
条件:
-
向用户展示演示 [在 (2,3,4) 中包含带有genre_id 的演示的结果]
仅显示在 (2,3,4) 中具有genre_id 的演示
如果 domo 的计数为零,则不向用户显示
【问题讨论】:
如果你仔细研究一下 $query->whereIn('genre_id',[2,3,4]);充当获取演示的子查询。我在这里看到的你必须使用 leftJoin 并添加 where 子句而不是使用雄辩的关系。 【参考方案1】:我觉得你需要only the users who has demos which has particular genres
$user->whereHas('demos', function($demoQuery)
$demoQuery->whereHas('genres', function ($genreQuery)
$genreQuery->whereIn('id',[2,3,4]);
);
)
->with([
'demos' => function($demoQuery)
$demoQuery->whereHas('genres', function ($genreQuery)
$genreQuery->whereIn('id',[2,3,4]);
);
])
->get();
where()
用于过滤,with()
用于急切加载演示。
【讨论】:
你的回答解决了这个问题,但又介绍了一个,我忘了提。我需要展示符合条件的演示。 @AmritShrestha 最后链接->with('demos')
。
我认为->with(['demos' => function($demoQuery) $demoQuery->whereHas('genres', function ($genreQuery) $genreQuery->whereIn('id',[2,3,4]); ); ]);
@TharakaDilshan:您的查询返回空白演示。如果演示计数为零,我需要删除记录。
不,关键是你需要两者都写。 ->whereHas()->with()
这个评论我写不出来我会编辑答案以上是关于Laravel 在带有分页的数据透视表中搜索的主要内容,如果未能解决你的问题,请参考以下文章