阅读(4341) (8)

Laravel 8 查询已存在的关联

2021-07-08 09:44:45 更新

在查询时,可能需要将关联记录是否存在作为条件。例如,查出至少有一条评论的文章。可以通过向 hasorHas 方法传递关联名称实现:

// 查出至少有一条评论的文章...
$posts = App\Models\Post::has('comments')->get(); 

也可以指定运算符和数量来进一步自定义查询:

// 查出至少有三条评论的文章...
$posts = App\Models\Post::has('comments', '>=', 3)->get(); 

也可以用「点」语法构造嵌套的 has 语句。例如,查出至少有一条评论和投票的文章:

// 查出至少有一条带投票评论的文章...
$posts = App\Models\Post::has('comments.votes')->get(); 

如果需要更多功能,可以使用 whereHasorWhereHas 方法将「where」条件放到 has 查询上。这些方法允许你向关联加入自定义约束,比如检查评论内容:

use Illuminate\Database\Eloquent\Builder;

// 获取至少带有一条评论内容包含 foo% 关键词的文章...
$posts = App\Models\Post::whereHas('comments', function (Builder $query) {
    $query->where('content', 'like', 'foo%');
})->get();

// 获取至少带有十条评论内容包含 foo% 关键词的文章...
$posts = App\Models\Post::whereHas('comments', function (Builder $query) {
    $query->where('content', 'like', 'foo%');
}, '>=', 10)->get();