Laravel-“;WhereHas”;查询:每个用户不同


Laravel - "WhereHas" query: different for each user

抱歉,解释起来有点复杂,但基本上:线程表有很多消息。线程有以下列:

id, deleted_at_sender, deleted_at_receiver_ sender_id, receiver_id

消息表有以下列

thread_id, user_id, body

在我的查询中,我试图获取线程被发送到的用户尚未删除的线程。例如,如果user1user2发送消息,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()。但我恐怕目前无法检查它是否有效或发表进一步评论。希望它至少能让你朝着正确的方向前进。:)