Доктрина 2 подзапрос

Я хочу реализовать подзапрос с помощью построителя запросов, но не понимаю его синтаксиса. Я имею дело с таблицей местоположений, в которой есть записи, которые могут быть городами, штатами или почтовыми индексами в зависимости от установленного типа местоположения. Я хочу получить все места, которые находятся в определенном состоянии, и убрать все, что относится к городскому типу и имеет население ниже определенного количества.

$qb->select('l')
->from('Entity\Location', 'l')
->where('l.state = :state')
->setParameter('state', 'UT')
->andWhere('...don't know what to put here');

В andWhere мне в основном нужно сказать

и где id нет (выберите id из локации, где location_type = 1 и население ‹ 1000)

Обновление: я смог сделать это с помощью прямого DQL, но было бы неплохо увидеть, как это сделать с помощью построителя запросов.

$qb->andWhere('l.id NOT IN (SELECT l2.id FROM Entity\Location AS l2 WHERE l2.location_type = 1 AND l2.population < 1000)');

person Jeremy Hicks    schedule 09.05.2011    source источник
comment
Похоже, мне даже не нужен подзапрос. Однако Гильерме также предложил мне просто использовать второй экземпляр построителя запросов и использовать его в качестве второго аргумента выражения in. groups.google.com/group/doctrine-user/browse_thread/thread/   -  person Jeremy Hicks    schedule 11.05.2011


Ответы (1)


В документации Doctrine я нашел это:

// Example - $qb->expr()->in('u.id', array(1, 2, 3))
// Make sure that you do NOT use something similar to $qb->expr()->in('value', array('stringvalue')) as this will cause Doctrine to throw an Exception.
// Instead, use $qb->expr()->in('value', array('?1')) and bind your parameter to ?1 (see section above)
public function in($x, $y); // Returns Expr\Func instance

// Example - $qb->expr()->notIn('u.id', '2')
public function notIn($x, $y); // Returns Expr\Func instance

Должна быть возможность поместить подзапрос в эту функцию. Я никогда не использовал это сам, но согласно документации это должно выглядеть так.

$qb->select('l')
   ->from('Entity\Location', 'l')
   ->where('l.state = :state')
   ->setParameter('state', 'UT')
   ->andWhere($qb->expr()->notIn('u.id', 
       $qb->select('l2.id')
          ->from('Entity\Location', 'l2')
          ->where(l2.location_type = ?1 AND l2.population < ?2)
          ->setParameters(array(1=> 1, 2 => 1000))
));

Я не на 100% уверен, что приведенный выше пример верен, но попробуйте.

person Rene Terstegen    schedule 20.10.2011