Laravel 查询生成器:whereExists 将条件子句转换为问号

Laravel Query Builder: whereExists translates condition clause to question mark

如果我使用查询生成器构建了以下查询:

$q = DB::table('Products')->whereExist(function ($q)
{
    $q->select(DB::raw(1))
      ->from('tags_products')
      ->where('products.PorductId', '=',  'tags_products.ProductID');
});

使用$q->toSql();翻译的SQL即:

select * from `Products` where `exist` = (select 1 from `tags_products` where `products`.`ProductID` = ?)

显然,查询生成器将 tags_products.ProductID 转换为 ?.

为什么会变成"?"?

这些是 mysql prepared statements

What is the question mark's significance in MySQL at "WHERE column = ?"?

Laravel 使用 mysql 的 PDO。

正如@Jared Eitnier 很好地指出的那样,Laravel 使用 PDO 将您传递给查询生成器方法的参数绑定。但是,因为当您使用 where 时,第三个参数表示值,除非您明确告诉它,否则 Laravel 不会将其视为列,否则它会将 'tags_products.ProductID' 视为常规字符串价值。所以你在这里有两个选择:

1. 使用DB::raw() 让查询生成器知道该值不是需要转义的字符串:

->where('products.PorductId', '=', DB::raw('tags_products.ProductID'));

2. 使用 whereRaw() 这将允许您编写原始 SQL 语句:

->whereRaw('products.PorductId = tags_products.ProductID');