最近我开始用Symfony和Propel 2.x编写代码,遇到了WHERE-IN子句的问题。
我想找1993年和1988年出生的客户。
所以我编写了这个推进查询代码片段:
$query = ClientQuery::create()
->where('YEAR(Client.Birthdate) IN ?', [1993, 1988])
->find();
... ORM将这些整数映射为DateTime对象,因此最终查询如下所示:
SELECT clients.id, clients.user_id, clients.first_name, clients.last_name, clients.birthdate, clients.document_id, clients.street, clients.postal_code, clients.city, clients.country
FROM clients
WHERE YEAR(clients.birthdate) IN ('1970-01-01','1970-01-01')
有没有办法使用推进来构建如下查询,而不使用原始SQL查询?
SELECT clients.id, clients.user_id, clients.first_name, clients.last_name, clients.birthdate, clients.document_id, clients.street, clients.postal_code, clients.city, clients.country
FROM clients
WHERE YEAR(clients.birthdate) IN (1993, 1988)
我已尝试添加
YEAR(clients.birthdate)
以使用别名进行选择,但也无法获得预期的查询。 最佳答案
可以尝试指定绑定类型:
->年(客户生日)在哪里,[1993, 1988 ],PDO::PARAMIN It)
编辑:
是的,你说得对。此解决方案将导致proplexception,因为Propel/PDO无法将数组绑定到int。
或者,您可以使用或条件:
$years = [1993, 1988];
// Get the key of the first element
$firstKey = key($years);
$query = ClientQuery::create();
foreach ($years as $key => $year) {
// Add _or() call for all elements except the first one
if ($key !== $firstKey) {
$query->_or();
}
// Add where condition and binding type
$query->where('YEAR(Client.Birthdate) = ?', $year, PDO::PARAM_INT);
}
$query = $query->find();
我同意这个解决方案看起来不太好,但它是有效的。
关于php - 推进WHERE IN子句和MySQL函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44442581/