Eloquent where子句不按预期工作

时间:2018-05-30 10:54:52

标签: laravel laravel-5 eloquent

我目前正在使用Laravel的私人消息系统。

我正在尝试在用户的收件箱中显示消息线程列表。这类似于即时消息传递系统如何显示消息,其中2个用户之间的所有消息都存储在单个线程中。

我遇到的问题是我有多种消息类型:"消息"和"任务"。在"消息"收件箱,我只想显示线程类型为" Message"的消息线程。为此,我在控制器中使用以下代码:

    $messageThreads = Thread::where('type', 'Message')
    ->where('sender_id', $user)
    ->orWhere('recipient_id', $user)
    ->get()
    ->sortByDesc('updated_at');

然而,这仍然无法正常工作,并且仍在检索类型为"任务"的消息线程。而不是仅限于"消息"

我也尝试过:

     $messageThreads = Thread::where('sender_id', $user)
    ->orWhere('recipient_id', $user)
    ->where('type', 'Message')
    ->get()
    ->sortByDesc('updated_at');

但是这也得到了同样的结果。

有趣的是,如果我把它留作

$messageThreads = Thread::where('type', 'Message')

它只会检索类型为" Message"的消息。只有当我添加其他"其中"条款,它停止正常工作。

1 个答案:

答案 0 :(得分:2)

如前所述,您可能需要对where子句进行分组:

Thread::where('type','Message')
->where(function($query)
{
    $query->where('sender_id',$user)
    ->orWhere('recipient_id',$user);
})->get();

原因是您正在寻找Thread where type Message orWhererecipient_id是{{1} }}。它们可能是不是类型消息的消息,但确实将用​​户作为收件人ID。

这是laravel文档

https://laravel.com/docs/5.6/queries#parameter-grouping