抱歉,解释起来有点复杂,但基本上:线程表有很多消息。线程有以下列:
id, deleted_at_sender, deleted_at_receiver_ sender_id, receiver_id
消息表有以下列
thread_id, user_id, body
在我的查询中,我试图获取线程被发送到的用户尚未删除的线程。例如,如果user1
向user2
发送消息,user2
可以删除它,他应该看不到它,而user1
应该仍然可以看到它。
我已经设置好了查询,它可以完美地(有点)
$messages = Message::select('*', 'DB::raw('max(created_at) as created_at'))
->where($get_user_id, uid())
->groupBy('thread_id')
->orderBy('created_at', 'desc')
->whereHas('thread', function ($q) {
$q->whereNull('deleted_at_receiver');
})
->paginate(10);
你可能会问的问题在哪里?是这行:$q->whereNull('deleted_at_receiver');
。你看,取决于当前登录的用户是邮件的接收者还是发送者,我真的无法填写。目前,我已经对此行的deleted_at_receiver
列进行了某种硬编码。
我需要找到一种方法来确定线程是否是由当前登录的用户创建的,并根据用户是发送方还是接收方来更改$q->whereNull('deleted_at_receiver');
。
非常感谢您的帮助。我花了两天多的时间试图弄清楚这一点,但没有运气。请帮帮伙计们。
谢谢。
不看查询的其余部分,听起来您可以使用稍微高级一点的where查询来解决这个问题。也许是这样的,尽管我不能100%确定这就是你想要的。
->whereHas('thread', function ($q) use ($user_id) {
$q->where(function ($q) use ($user_id) {
$q->whereNull('deleted_at_receiver')
->where('receiver_id', $user_id);
})-orWhere(function ($q) use ($user_id) {
$q->whereNull('deleted_at_sender')
->where('sender_id', $user_id);
});
})
也许您需要对或子句使用whereNested()
。但我恐怕目前无法检查它是否有效或发表进一步评论。希望它至少能让你朝着正确的方向前进。:)