Laravel Query Builder:whereExists将条件子句转换为问号

时间:2015-05-04 15:29:34

标签: laravel query-builder

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

$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 转换为

为什么会变成“?”

2 个答案:

答案 0 :(得分:4)

正如@Jared Eitnier所指出的那样,Laravel使用PDO绑定传递给Query Builder方法的参数。但是,因为当您使用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');

答案 1 :(得分:0)

这些是mysql prepared statements

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

Laravel使用mysql的PDO。