代码之家  ›  专栏  ›  技术社区  ›  Jaquarh

如何在PHP中使用laravel query builder和where子句?

  •  0
  • Jaquarh  · 技术社区  · 5 年前

    在执行与用户相关的操作之前,我试图确保数据库中存在记录。当我像这样直接在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 = ?
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   Devon Bessemer    5 年前

    在PHP中,对象是通过引用传递的,这意味着无论在何处使用 participants 财产。因此,在大多数情况下,您都希望为每个查询实例化一个新的查询生成器对象。

    但是,PHP允许克隆对象,这将允许您传递基本查询生成器并重新开始 到处 你用它:

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

    这是原型OO模式的一个实现,构建一个基本对象,然后创建它的一个副本来完成具体的工作。

    这只是一种避免在查询表名时对其进行硬编码的方法。