推动WHERE IN子句和MySQL函数

时间:2017-06-08 17:56:05

标签: php mysql symfony propel

最近我开始使用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,但我也无法获得预期的查询。

2 个答案:

答案 0 :(得分:2)

<德尔> 您可以尝试指定绑定类型:      - &gt; where(&#39; YEAR(Client.Birthdate)IN?&#39;,[1993,1988],PDO :: PARAM_INT)

编辑:

是的,你是对的。此解决方案将导致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个条件:

  • birthdate&gt; ='1993-01-01'AND birthdate&lt; '1994-01-01'
  • OR birthdate&gt; ='1988-01-01'AND birthdate&lt; '1989-01-01'

您可以使用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时间戳会使你的应用程序逻辑更容易构建查询。