2015-04-20 2 views
2

В настоящее время я пытаюсь построить запрос с Doctrine2 QueryBuilder. Тем не менее, я застреваю при попытке сделать следующее:Как создать запрос с QueryBuilder?

У меня есть объект под названием «Клиент». Этот объект стоит в ManyToMany-Relation для «User». «Пользователь» снова стоит в многопользовательском отношении к номеру телефона.

Так что это довольно много:

Customer <- @ManyToMany -> User <- @ManyToMany -> PhoneNumber 

Теперь я пытаюсь выбрать клиента, основанный на PhoneNumber. Так что сейчас у меня есть следующие:

$qb = $this->getEntityManager()->createQueryBuilder(); 
$qb 
    ->select('c') 
    ->from('AppBundle:Customer', 'c') 
    ->join('AppBundle:User', 'u') 
    ->join('AppBundle:PhoneNumber', 'u'); 

проблема сейчас в том, что я не знаю о том, как построить где-раздел запроса. Причина в том, что к клиенту может быть несколько пользователей и несколько телефонных номеров. У вас есть идея о том, как действовать?

+3

Ни одно из этих отношений m: n не кажется правильным. Один номер телефона может принадлежать нескольким пользователям? Один пользователь может быть несколькими клиентами и наоборот? – marekful

+0

вы задаете один и тот же псевдоним для 'User' &' PhoneNumber', как говорит @MarcellFulop, у вас неверные отношения, как у нескольких пользователей может быть одинаковый номер телефона? – ghanbari

+0

Что в этом плохого? Например, если есть два брата, которые все еще живут дома со своими родителями - тогда номер телефона, очевидно, будет таким же. Я заметил проблему с псевдонимами и исправил ее, но у меня все еще есть такая же проблема. – chrisp

ответ

0

Если у вас есть объекты с mappedBy/InversedBy вы можете сделать

$qb = $this->getEntityManager()->createQueryBuilder(); 
$qb 
    ->select('c') 
    ->from('AppBundle:Customer', 'c') 
    ->innerJoin('c.users', 'u') 
    ->innerJoin('u.phoneNumbers', 'p') 
    ->andWhere('p.number = :numberPhone') 
    ->setParameter('numberPhone', $varPhoneNumber) 
; 
0

Мое решение:

Использование innerJoin() и 'ЧЛЕН' исправили проблему. Таким образом, я могу подключить каждую сущность к любому другому объекту. Например:

$qb = $this->getEntitiyManager()->createQueryBuilder() 
    ->select('c') 
    ->from('AppBundle:Customer', 'c') 
    ->innerJoin('AppBundle:User', 'u', 'WITH', 'c.id MEMBER OF c.users') 
    ->innerJoin('AppBundle:PhoneNumber', 'ph', 'WITH', 'ph.id MEMBER OF u.phoneNumbers') 
    ->orWhere($qb->expr()->orX(
      $qb->expr()->eq('ph.number', ':number') 
    )) 
    ->setParameter('number', $somePhoneNumber); 
Смежные вопросы