2016-09-16 73 views
1

我想搜索未分配給房間的人。我做了以下查詢:學說:主要實體ID在子查詢數組中的子查詢

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

的感謝!我目前正在檢查這個。我想知道是否有一個人的ID爲100和一個人的ID爲1000,它可能會返回「不爲空」,而這可能不是這樣。 p.id也可能發生在數組的其他地方。將很快回到這一點。 – apfz

+0

它只適用於我 - > setParameter(':myid','%i:556%'),其中556是硬編碼的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