最近我开始用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/

10-10 15:13