Laravel使用渴望加载的关系

时间:2017-01-22 05:22:38

标签: laravel orm eager-loading

您好我有以下代码来检索所有帖子及其评论(1对多关系)

$posts = Post::with('comments')->get();

现在它的效果很好,但我的问题是,如果给出一个可选参数,我想对帖子标题或评论内容进行搜索。类似的东西:

$posts = Post::with('comments');

if (Request::has('query')) {
    $posts = $posts->where('content', 'LIKE', '%' . Request::get('query'))->orwhere('title', 'LIKE', '%' . Request::get('query'));
}

$posts = $posts->get();

现在这不起作用,因为“内容”列仅存在于评论表中。有没有办法在热切加载的评论关系中使用where条件?

3 个答案:

答案 0 :(得分:0)

在构建查询时使用whereHas(),来自文档的示例:

$posts = Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
})->get();

Docs link

答案 1 :(得分:0)

使用orWhereHas()orWhere()

whereHas()

测试一下。如果您想要更改行为,可以在where()构建中使用if()和/或{{1}}。

答案 2 :(得分:0)

使用Constraining Eager Loads

if (request()->has('query')) {
    $posts = Post::where('title', 'LIKE', '%' . Request::get('query'))->with(['comments' => function ($query) {
        $query->orWhere('content', 'LIKE', '%' . Request::get('query'));
    }]);
} else {
    $posts = Post::with('comments');
}

$posts = $posts->get();

我认为@Alexey Mezenin的答案不正确,结果将是所有评论的帖子。