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 在带有分页的数据透视表中搜索的主要内容,如果未能解决你的问题,请参考以下文章

带有查询分页的 Django 搜索页面

与 Laravel 分页一起使用的表格搜索

在 Laravel 的数据透视表中添加 id 列有啥好处?

laravel 多对多关系不存储在数据透视表中

在 laravel 的数据透视表中存储数据

使用 Laravel 数据透视表生成干净格式的 json