Как получить сумму withCount на множественные отношения в laravel - PullRequest
2 голосов
/ 21 мая 2019

У меня есть три основных таблицы пользователей и гостей и сообщений

Также у меня есть таблица с именем user_views: для хранения уникальных пользователей просмотров сообщений

post_id   user_id
1         10002
2         10003
3         10011

И еще одна таблица с именем guest_views: для хранения уникальных гостей просмотров сообщений

post_id   guest_id
1         10002
2         10003
3         10011

В почтовой модели у меня есть:

public function user_views()
{
    return $this->hasMany('App\Models\PostUserView');
}

public function guest_views()
{
    return $this->hasMany('App\Models\PostGuestView');
}

В следующем коде получите правильные результаты, но с двумя разными ключами.

$posts = Post::all()
            ->withCount('user_views')
            ->withCount('guest_views')

Я подумал о слиянии user_views и guest_views, а затем вычислил количество следующим образом, но результат включает только количество user_views

public function views()
{
    return $this->user_views()->unionAll($this->guest_views());
}

После выполнения следующего кода

$posts = Post::all()
            ->withCount('views')
            ->withCount('user_views')
            ->withCount('guest_views')

Я получаю этот результат

"views_count": 5, 
"user_views_count": 5,
"guest_views_count": 2,

Пример ожидаемого результата для prevues:

"views_count": 7, 
"user_views_count": 5,
"guest_views_count": 2,

Также я пытаюсь использовать SQL-запрос следующим образом

public function views()
{
    return DB::raw("(select * from post_views) union all (select * from post_guest_views)");
}

Но получите

"Call to undefined method Illuminate\Database\Query\Expression::getRelationExistenceCountQuery()"

Поэтому я хотел бы получить общее количество просмотров от всех пользователей и гостей для каждого сообщения.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

В вашем сообщении модели

public function user_views()
{
    return $this->hasMany('App\Models\PostUserView','user_id','id');
}

public function guest_views()
{
    return $this->hasMany('App\Models\PostGuestView','user_id','id');
}

public function views() 
{
   return $this->user_views()->unionAll($this->guest_views()); 
}

Теперь вы можете получить доступ

$posts = Post::withCount(['user_views','guest_views','views'])->get()

Примечание

Каждый параметр, указанный в withCount () , становится свойство _count основного объекта. Так что в этом случае мы будем иметь $ posts-> guest_views_count, $ posts-> views_count и Переменные $ posts-> user_views_count.

Надеюсь, это сработает для вас.

0 голосов
/ 21 мая 2019

Вы можете получить количество просмотров, используя join(). Ниже приведен пример кода: -

$posts = Post::join('user_views as uv', function($q) {
    $q->on('uv.post_id', '=', 'posts.id');
})
->join('guest_views as gv', function($q) {
    $q->on('gv.post_id', '=', 'posts.id');
})
->selectRaw("posts.*, COUNT(uv.id) as user_views_count, COUNT(gv.id) guest_views_count, SUM(COUNT(uv.id) + COUNT(gv.id)) as views_count")
->groupBy("posts.id")
->get();

Попробуйте это.

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