Laravel hasManyThrough возвращает неправильно withCount, но хорошо -> count () - PullRequest
0 голосов
/ 11 ноября 2019

Я стремлюсь загрузить отношения, чтобы они могли возвращать количество разных комментаторов в блоге. Например:

->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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...