使用 laravel 查询构建器构建查询

Build query using laravel query builder

您会在底部找到完整的功能。我希望查询是这样的,但是在 laravel 查询生成器中:

    $sql = "SELECT * FROM chat WHERE (sender='$receiver' AND 
           receiver='$sender'AND status='sent') OR (sender='$sender' AND 
           receiver='$receiver'AND status='sent')";

此查询应该从聊天中检索消息,例如:发送者=3 和接收者=4,反之亦然。基本上是这两个人之间的聊天。

现在我在 laravel 中做了类似的事情,returns 整个聊天 table 它应该只检索给定的发送者和接收者之间的聊天。我知道问题出在 where 和 orWhere 子句中。

     public function reloadChat(Request $request)
{
    $sender = $request["sender"] ;
    $receiver = $request["receiverid"] ;

    $chats =  DB::table('chats')
                    -> where(['sender_id' => $sender , 'receiver_id' => $receiver , 'status' => "sent" ])
                    -> orWhere(['sender_id' => $receiver , 'receiver_id' => $sender , 'status' => "sent" ])

                    ->get();



                    foreach ($chats as $result)
                    {
                        if($result->sender_id==$sender)
                        {
                            echo "<div class=msgsend>".$result->message."</div>";
                        }else{
                            echo "<div class=msgrec>".$result->message."</div>";
                        }

                    }

}   

P.S。 - 绝对是 laravel

的新手

编辑:

这行得通。但是当我使用变量而不是 3 和 4 id 时,它就不会了。

    public function reloadChat(Request $request)
    {
    $sender = $request["sender"] ;
    $receiver = $request["receiverid"] ;
    var_dump($sender) ;
    var_dump($receiver) ;
    $chats =  DB::table('chats')
                    -> where(function($query) {
                         $query->where('sender_id', "3")
                               ->where('receiver_id', "4")
                               ->where('status', "sent");
                        })
                    -> orWhere(function($query) {
                         $query->where('sender_id', "4")
                                ->where('receiver_id', "3")
                                ->where('status', "sent");
                        })->get();

    }   

你可以试试这个:

 $chats = \DB::table('chats')
    -> where(function($query) {
        $query->where('sender_id', $sender)
            ->where('receiver_id', $receiver)
            ->where('status', status)
    })
    -> orWhere(function($query) {
        $query->where('sender_id', $receiver)
            ->where('receiver_id', $sender)
            ->where('status', status)
    })->get();

我发布的代码模拟了括号,因此它与您的原始查询的行为相同。如果它不起作用,我认为问题出在其他地方,您可能需要重新检查您的原始查询或您的参数。

访问文档Advanced wheres

示例使用

$chats =  DB::table('chats')->where(function($query)
{
    $query->where(['sender_id' => $sender , 'receiver_id' => "1", 'status' => "sent" ]);
})->orWhere(function($query)
{
    $query->where(['sender_id' => "2", 'receiver_id' => "1", 'status' => "sent" ])
})->toSql();

toSql(); = return 创建了 sql 没有参数的命令