2016-09-16 2 views
1

Я бы хотел найти людей, которые не выделены в номер. Я сделал следующий запрос:Доктрина: Суб-запрос, где основной идентификатор объекта находится в массиве подзапроса

public function findByWithoutRoom() 
{ 
    $qb = $this->getEntityManager()->createQueryBuilder(); 
    $qb2 = $this->getEntityManager()->createQueryBuilder(); 

    $qb 
     ->select('p') 
     ->from('MyPeopleBundle:Person', 'p') 

     ->where(
      $qb->expr()->exists(
       $qb2->select('r') 
        ->from('MyAccommodationBundle:Room', 'r') 
        ->andWhere($qb2->expr()->like('r.currentPeople', ':person')) 
        ->setParameter('person', '%i:'.$person_id.';%') 

        ->getDQL() 
      ) 
     ) 

    $result = $qb->getQuery()->execute(); 
    return $result; 
} 

Как я могу использовать p.id вместо person_id? Примечание: currentPeople свойство типа "массив" (не "simple_array")

UPDATE:

Я также попробовал следующее:

public function finByWithoutRoom() 
{ 
    $qb = $this->getEntityManager()->createQueryBuilder(); 
    $qb 
     ->select('p') 
     ->from('MyPeopleBundle:Person', 'p') 
     ->leftJoin('MyAccommodationBundleV2:Room', 'r') 
     ->andWhere($qb->expr()->like('r.currentPeople', '%i:p.id%')); 

    $result = $qb->getQuery()->execute(); 
    return $result; 
} 

однако это дало мне следующую ошибку:

[Syntax Error] line 0, col 114: Error: Expected StateFieldPathExpression | string | InputParameter | FunctionsReturningStrings | AggregateExpression, got '%' 

ответ

1

Вы можете использовать непосредственно псевдоним основного запроса, в качестве примера:

$qb 
    ->select('p') 
    ->from('MyPeopleBundle:Person', 'p') 
    ->where(
     $qb->expr()->isNotNull(
      $qb2->select('r') 
       ->from('MyAccommodationBundle:Room', 'r') 
       ->andWhere($qb->expr()->like('r.currentPeople', 'p.id')) 

       ->getDQL() 
     ) 
    ) 

    ->setParameter('from', $from) 
    ->setParameter('to', $to); 

Я предлагаю использовать not exists вместо is not null (думаю, это тот же результат, однако). Как пример:

$qb->andWhere($qb->expr()->not($qb->expr()->exists($qb2->getDQL()))); 

Надеется, что это помощь

+1

спасибо! Я в настоящее время проверяю это. Интересно, есть ли человек с идентификатором 100 и один человек с идентификатором 1000, он может вернуться как «не null», в то время как это может быть не так. p.id также может встречаться в другом месте массива. вернемся к этому в ближайшее время. – apfz

+0

работает только тогда, когда я делаю -> setParameter (': myid', '% i: 556%'), где 556 - это hardcoded p.id. есть ли способ, которым можно добавить подстановочные знаки в указанном вами формате? ($ qb-> expr() -> like ('r.currentPeople', 'p.id')) – apfz

+0

мы могли бы использовать SQL concat, как описано [здесь] (http://stackoverflow.com/a/4420559/2270041), но зависит от версии доктрины, которую вы используете, если у вас есть [pr] (https://github.com/doctrine/doctrine2/pull/1397). – Matteo

Смежные вопросы