【问题标题】:Eloquent where clause not working as expected雄辩的 where 子句没有按预期工作
【发布时间】:2018-05-30 19:23:38
【问题描述】:

我目前正在使用 Laravel 开发一个私人消息系统。

我正在尝试在用户的收件箱中显示消息线程列表。这类似于即时消息系统显示消息的方式,即两个用户之间的所有消息都存储在一个线程中。

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

    $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')

它只会检索“消息”类型的消息。只有当我添加其他“where”子句时,它才会停止正常工作。

【问题讨论】:

    标签: laravel laravel-5 eloquent


    【解决方案1】:

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

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

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

    在 laravel 文档中

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

    【讨论】:

    • 非常感谢,不得不从 $user 中删除报价,但它按预期工作。
    • 其实我觉得return没必要想重新编辑一下X(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多