Laravel 模型关联:更多使用方法 – 3
配套视频地址:https://www.bilibili.com/video/av73028135?p=11
查询多态模型
morphTo
use Illuminate\Database\Eloquent\Builder;
// 查询与帖子或视频相关并且标题以 foo 开头的评论...
$comments = App\Comment::whereHasMorph(
'commentable',
['App\Post', 'App\Video'],
function (Builder $query) {
$query->where('title', 'like', 'foo%');
}
)->get();
// 查询与帖子相关的评论,标题不是以 foo 开头的...
$comments = App\Comment::whereDoesntHaveMorph(
'commentable',
'App\Article',
function (Builder $query) {
$query->where('title', 'like', 'foo%');
}
)->get();
/**
SELECT *
FROM `comments`
WHERE `commentable_type` = 'App\Article'
AND NOT EXISTS (
SELECT *
FROM `articles`
WHERE `comments`.`commentable_id` = `articles`.`id`
AND `body` LIKE 'foo%'
)
*/
// $type 参数根据相关模型添加不同的约束:
$comments = App\Comment::whereHasMorph(
'commentable',
['App\Post', 'App\Video'],
function (Builder $query, $type) {
$query->where('title', 'like', 'foo%');
if ($type === 'App\Post') {
$query->orWhere('content', 'like', 'foo%');
}
}
)->get();
// 所有多态类型
$comments = App\Comment::whereHasMorph('commentable', '*', function (Builder $query) {
$query->where('title', 'like', 'foo%');
})->get();
模型计数
$posts = App\Post::withCount('comments')->get();
// select `posts`.*, (select count(*) from `comments` where `posts`.`id` = `comments`.`post_id`) as `comments_count` from `posts`
foreach ($posts as $post) {
echo $post->comments_count;
}
$posts = App\Post::withCount(['votes', 'comments' => function (Builder $query) {
$query->where('content', 'like', 'foo%');
}])->get();
echo $posts[0]->votes_count;
echo $posts[0]->comments_count;
$posts = App\Post::withCount([
'comments',
'comments as pending_comments_count' => function (Builder $query) {
$query->where('approved', false);
},
])->get();
echo $posts[0]->comments_count;
echo $posts[0]->pending_comments_count;
App\Post::select(['title', 'body'])->withCount('comments')->get();
$post = App\Post::first();
$post->loadCount('comments');
// select `id`, (select count(*) from `comments` where `posts`.`id` = `comments`.`post_id`) as `comments_count` from `posts` where `posts`.`id` in (1)
$post->loadCount(['comments' => function ($query) {
$query->where('rating', 5);
}])