我为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');
}
谢谢!
答案 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
。