Я стремлюсь загрузить отношения, чтобы они могли возвращать количество разных комментаторов в блоге. Например:
->withCount('commentators as total_commentators_count')
Теперь, на мой взгляд, следующее не вернет правильный счет: $post->total_commentators_count
, но следующее вернет правильный счет: $post->commentators->count()
даже если они делают то же самое. Как получилось?
Вот несколько скриншотов (я размыл ненужный код для удобства):
https://i.imgur.com/bNcrVid.png
https://i.imgur.com/WlzVqAs.png
Вот мойОтношение commentators () (внутри черты Commentable.php, которую использует моя модель BlogPost):
public function commentators(): hasManyThrough
{
/** @noinspection PhpUndefinedMethodInspection */
return $this->hasManyThrough(
'App\User',
'App\Comment',
'commentable_id',
'id',
'id',
'user_id'
)
->where('commentable_type', array_search(static::class, Relation::morphMap()) ? : static::class)
->groupBy('users.id', 'comments.commentable_id')
->orderByRaw('MIN(comments.created_at) ASC, users.created_at ASC, users.id ASC');
}
Таблица comments
полиморфна.
и вот что такое $posts
(см. скриншот), который должен загружать commentators
и считать его, на самом деле работает в SQL:
select `posts`.*,
(select count(*) from `users` inner join `comments` on `comments`.`user_id` = `users`.`id` where `comments`.`deleted_at` is null and `posts`.`id` = `comments`.`commentable_id` and `comments`.`deleted_at` is null and `commentable_type` = ? and `users`.`deleted_at` is null) as `total_commentators_count`,
(select count(*) from `comments` where `posts`.`id` = `comments`.`commentable_id` and `comments`.`commentable_type` = ? and `comments`.`deleted_at` is null) as `total_comments_count`,
(select count(*) from `comments` where `posts`.`id` = `comments`.`commentable_id` and `comments`.`commentable_type` = ? and `user_id` = ? and `comments`.`deleted_at` is null) as `user_comments_count`
from `posts`
where `posts`.`deleted_at` is null order by `created_at` desc"
кажется, что отсутствуют все части groupBy и orderByRaw?
Основная идея этого заключается в следующем: я пытаюсь показать, сколько разных людей прокомментировали сообщение (хотя есть 100 комментариев, которые могут быть просто двумя разными пользователями, отвечающими друг другу).
Laravel 6.1.0 / PHP 7.3.10 / MySQL 5.5.60