雄辩地按相关表计数

时间:2018-07-01 17:14:11

标签: mysql laravel eloquent

我为laravel创建了Messenger。现在,我想列出用户正在参与的所有线程,并在每个线程中列出一些消息。我需要对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 :(得分:1)

尝试将withCount用于线程消息。 :

$threads = Participant::withCount(['thread.messages as message_count'])
                      ->where('user_id', auth()->id())
                      ->having('message_count', '>', 0)
                      ->get();

答案 1 :(得分:1)

您可以将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