如何将 Laravel 查询生成器与 PHP 中的 Where 子句一起使用?

How to Use Laravel Query Builder with and Where Clause in PHP?

我正在尝试确保在执行与用户相关的操作之前数据库中存在一条记录。当我像这样直接在我的 PHPMyAdmin 中执行查询时(出于测试目的)。

SELECT * FROM `chat_participants` WHERE `chat_id` = 2 AND `user_id` = 2

我收到了正确的记录。但是,当我尝试使用 Laravel 查询生成器来实现相同的目的时。

dd($this->participants
    ->where('chat_id', '=', 2)
    ->where('user_id', '=', 2)
    ->get()
    ->first());

我得到 null. 有没有一种方法可以使用查询生成器确保记录存在于数据库中?我需要在查询生成器中声明 AND 吗?

更新:我在构造函数中设置了 participants 变量。

public function __construct()
{
    $this->middleware('auth');
    $this->header = DB::table('chat_headers');
    $this->participants = DB::table('chat_participants');
    $this->messages = DB::table('chat_messages');
}

toSql() 产生:

select * from chat_participants` 
    inner join chat_headers on chat_headers.id = chat_participants.chat_id 
    inner join chat_rbac on chat_rbac.id = chat_participants.rbac 
 where chat_participants.chat_id = ? and chat_participants.user_id = ? 
    and chat_id = ? and user_id = ?

对象在 PHP 中通过引用传递,这意味着您在使用 participants 属性 的任何地方传递指向同一个查询生成器对象的指针。所以在大多数情况下,您会希望为每个查询实例化一个新的查询构建器对象。

但是,PHP 确实允许克隆对象,这将允许您传递基本查询构建器并在您使用它的任何地方重新开始:

$query = clone $this->participants;
$query->where(..)->first();

这是 Prototype OO 模式的一个实现,构建一个基础对象,然后创建它的一个副本来完成细节。

这只是您可以避免在任何查询时都对 table 名称进行硬编码的一种方法。