【问题标题】:Laravel search in pivot table with paginationLaravel 在带有分页的数据透视表中搜索
【发布时间】:2019-03-09 13:58:33
【问题描述】:

我需要搜索演示类型。

注意:我已经隐藏了其他搜索的简洁性。

背景:

表格:

  1. 用户 [id, name, ...]
  2. 演示 [id, name, user_id]
  3. 流派 [id, name]
  4. 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。

条件:

  1. 向用户展示演示 [在 (2,3,4) 中包含带有genre_id 的演示的结果]
  2. 仅显示在 (2,3,4) 中具有genre_id 的演示
  3. 如果 domo 的计数为零,则不向用户显示

【问题讨论】:

  • 如果你仔细研究一下 $query->whereIn('genre_id',[2,3,4]);充当获取演示的子查询。我在这里看到的你必须使用 leftJoin 并添加 where 子句而不是使用雄辩的关系。

标签: laravel search filter eloquent relationship


【解决方案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()这个评论我写不出来我会编辑答案
猜你喜欢
  • 2019-07-09
  • 2013-08-10
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 2015-03-14
  • 2018-08-31
  • 1970-01-01
  • 2019-08-15
相关资源
最近更新 更多