如果我使用查询生成器构建了以下查询:
$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 转换为?。
为什么会变成“?”?
答案 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。