Laravel 8 查询已存在的关联
在查询时,可能需要将关联记录是否存在作为条件。例如,查出至少有一条评论的文章。可以通过向 has
和 orHas
方法传递关联名称实现:
// 查出至少有一条评论的文章...
$posts = App\Models\Post::has('comments')->get();
也可以指定运算符和数量来进一步自定义查询:
// 查出至少有三条评论的文章...
$posts = App\Models\Post::has('comments', '>=', 3)->get();
也可以用「点」语法构造嵌套的 has
语句。例如,查出至少有一条评论和投票的文章:
// 查出至少有一条带投票评论的文章...
$posts = App\Models\Post::has('comments.votes')->get();
如果需要更多功能,可以使用 whereHas
和 orWhereHas
方法将「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();