9

这是 dql 查询

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

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

$dql = "SELECT t Entities\Table t WHERE t.field1 IN (108919,108920)";

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

4

5 回答 5

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();
于 2012-02-17T15:30:58.213 回答
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();

您可以在不使用 implode() 的情况下传入一个数组,并且学说会正确处理它(作为整数列表)。

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

这里也提到了这一点:How to use the in statement in DQL in Doctrine 2.0

于 2011-12-11T07:34:43.320 回答
1

以下应该按预期工作(对于IN子句的任意数量的参数)

$params = array(1 => 108919, 2 => 108920);
$qb = $em->createQueryBuilder();
$qb->select(array('t'))
   ->from('Entities\Table', 't')
   ->where($qb->expr()-> in('t.field', array_map(function($p) { return '?'.$p; }, array_keys($params)))
   ->setParameters($params);
$q = $qb->getQuery();
$r = $q->getResult();
于 2011-09-23T11:03:17.263 回答
0

这是有效的

public function searchCategory($target){

      $query = $this->getEntityManager()
                    ->createQuery("SELECT ct.id as id,ct.name as name, ct.target as target FROM LoveThatFitAdminBundle:ClothingType ct WHERE ct.target IN (:target)")
                     ->setParameter('target',$target['target']);
                     try {
                     return $query->getResult();
                } catch (\Doctrine\ORM\NoResultException $e) {
                return null;
                }

 }
于 2013-10-07T12:34:23.357 回答
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();

解决方案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();
于 2011-09-23T10:49:00.847 回答