Красноречивое получение по количеству связанных таблиц - PullRequest
0 голосов
/ 01 июля 2018

Я создал мессенджер для Laravel. Теперь я хочу перечислить все темы, в которых участвует пользователь, с количеством сообщений в каждой теме. Мне нужно количество до предложения where, потому что я хочу показать только эти потоки, в которых есть сообщения.

Мой текущий запрос:

$threads = Participant::with('thread.messages') -> where('user_id', Auth::user() -> id) -> get();

Участник:

public function user()
{
    return $this -> hasOne(User::class, 'id', 'user_id');
}
public function thread()
{
    return $this -> hasOne(Thread::class, 'id', 'thread_id');
}

Тема:

public function participants()
{
    return $this -> hasMany(Participant::class, 'thread_id', 'id');
}
function messages()
{
    return $this -> hasMany(Message::class, 'thread_id', 'id');
}

Сообщение:

function user()
{
    return $this -> belongsTo(User::class, 'user_id', 'id');
}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Вы можете использовать has для отношения messages, чтобы проверить, есть ли в ветке сообщения. После этого вам нужно отфильтровать отношения участников, используя whereHas И, наконец, используйте withCount для подсчета сообщений в потоке.

$threads = Thread::has('messages')
                    ->whereHas('participants', function($query){
                        return $query->where('user_id', Auth::user()->id);
                    })->withCount('messages')->get();

Печать данных

foreach($threads as $thread){
    dd($thread->messages_count);
}

Примечание: Имя вашего отношения thread в Participant модели должно быть belongsTo вместо hasOne.

0 голосов
/ 01 июля 2018

Попробуйте использовать withCount для сообщений темы. :

$threads = Participant::withCount(['thread.messages as message_count'])
                      ->where('user_id', auth()->id())
                      ->having('message_count', '>', 0)
                      ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...