如何处理Doctrine2中WHERE子句中的"IN"

Joh*_* W. 9 php doctrine doctrine-orm

这是dql-query

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1)";
    $q = $em->createQuery($dql)
                ->setParameter(1, '108919,108920');
    $result = $q->execute();
Run Code Online (Sandbox Code Playgroud)

如果我通过setParameter传递参数doctrine只返回第一个结果,但是如果我将它们直接放入dql-query中则返回2个结果(这是正确的):

$dql = "SELECT t Entities\Table t WHERE t.field1 IN (108919,108920)";
Run Code Online (Sandbox Code Playgroud)

如何通过setParameter处理WHERE子句中的"IN"?

小智 9

请注意,这仅适用于编号参数,而不适用于命名参数.

$searchParameters = array(108919, 108920);

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1)";
$q = $em->createQuery($dql)
   ->setParameter(1, $searchParameters);

$result = $q->execute();
Run Code Online (Sandbox Code Playgroud)

  • 我正在撕扯我的头发试图弄清楚为什么我无法使数组参数工作 - 用编号替换命名参数保存我的一天:-) (2认同)

zei*_*ist 6

以下应该工作正常:

$searchParameters = array(108919, 108920);

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1)";
$q = $em->createQuery($dql)
   ->setParameter(1, $searchParameters);

$result = $q->execute();
Run Code Online (Sandbox Code Playgroud)

您可以传入一个数组,而不使用implode(),并且doctrine将正确处理它(作为整数列表).

注意:如果您已经使用字符串'108919,108920',则需要使用explode和trim函数.

这里也提到了:如何在Doctrine 2.0中的DQL中使用in语句


小智 0

解决方案1:

$dql = "SELECT t Entities\Table t WHERE t.field IN (?1, ?2)";
$q = $em->createQuery($dql)
->setParameters(array(1 =>'108919', 2 => '108920'));
$result = $q->execute();
Run Code Online (Sandbox Code Playgroud)

解决方案2(更优雅):

$parameters = array(1 =>'108919', 2 => '108920');
$dql = 'SELECT t Entities\Table t WHERE t.field IN (?'.implode(', ?', array_keys($parameters)).')';
$q = $em->createQuery($dql)
->setParameters($parameters);
$result = $q->execute();
Run Code Online (Sandbox Code Playgroud)