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');
如果我使用查询生成器构建了以下查询:
$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');