最近我开始使用Symfony和Propel 2.x进行编码,我遇到了WHERE IN子句的问题。
我希望得到1993年和1988年出生的客户。
所以我写了这个Propel Query代码片段:
$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')
有没有办法使用Propel来构建如下所示的查询,而不使用RAW 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)
到SELECT,但我也无法获得预期的查询。
答案 0 :(得分:2)
编辑:
是的,你是对的。此解决方案将导致PropelException,因为Propel / PDO无法将数组绑定到int。
或者你可以使用OR条件:
$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();
我同意这个解决方案看起来不太好,但它确实有用。
答案 1 :(得分:0)
是的,看起来你将不得不使用4个条件:
您可以使用tr = df_trainers.loc[df_trainers['name'] == name, 'trainer'].iloc[0]
类的condition()
和combine()
方法执行此操作。
http://propelorm.org/Propel/reference/model-criteria.html#combining-several-conditions
我建议不要使用ClientQuery
方法。
另外,我敢打赌,使用unix时间戳会使你的应用程序逻辑更容易构建查询。