2017-01-04 3 views
4

У меня есть два сущности Person и Nursery, и у меня есть отношение ManyToMany между ними с JoinTable. Я хочу сделать это 2 SQL запросов:Doctrine query builder дает неправильный результат

1) Найти все сотрудники (= Person), связанные с детской с nursery_id

select p.* from person p inner join nursery_staff ns on p.id = ns.staff_id inner join nursery n on ns.nursery_id = n.id where n.id=1 and p.nursery_staff_role <> 'MANAGER'; 

2) Найти персонал с staff_id и быть уверенным, что он связан с питомник с nursery_id

select p.* from person p inner join nursery_staff ns on p.id = ns.staff_id inner join nursery n on ns.nursery_id = n.id where n.id=2 and p.id=4 and p.nursery_staff_role <> 'MANAGER'; 

Для этого у меня есть это 2 запросов в PersonRepository:

1)

public function findAllStaffLinkedToANursery($nursery_id) 
{ 
    $qb = $this->_em->createQueryBuilder(); 
    $qb->select('p') 
     ->from($this->_entityName, 'p') 
     ->innerJoin('VSCrmBundle:Nursery', 'n') 
     ->where('n.id = :id') 
     ->andWhere('p.nurseryRole <> :profession') 
     ->setParameters(array('id' => $nursery_id, 'profession' => 'MANAGER')); 

    return $qb->getQuery()->getResult(); 
} 

2)

public function findOneByNurseryAndStaffId($nursery_id, $staff_id) 
{ 
    $qb = $this->_em->createQueryBuilder(); 
    $qb->select('p') 
     ->from($this->_entityName, 'p') 
     ->innerJoin('VSCrmBundle:Nursery', 'n') 
     ->where('p.id = :pid') 
     ->andWhere('n.id = :nid') 
     ->andWhere('p.nurseryRole <> :staffRole') 
     ->setParameters(array(
      'pid' => $staff_id, 
      'nid' => $nursery_id, 
      'staffRole' => 'MANAGER' 
     )); 

    return $qb->getQuery()->getOneOrNullResult(); 
} 

Но в обоих случаях, что запросы не заботится о nursery_id и что дает мне сотрудников undepended из nursery_id. Например, Person с id = 4 не связан с детской с id = 2, но этот запрос показывает мне этого человека.

EDIT: У меня есть один и тот же результат с DQL запроса:

php bin/console doctrine:query:dql "select p.email from VSCrmBundle:Person p inner join VSCrmBundle:Nursery n where n.id=2 and p.nurseryRole <> 'MANAGER'" 

ответ

0

Может быть, это так, как вы присоединитесь к Nursery лица. Попробуйте присоединиться к нему из атрибута Person объекта, как это:

public function findAllStaffLinkedToANursery($nursery_id) 
{ 
    $qb = $this->_em->createQueryBuilder(); 
    $qb->select('p') 
     ->from($this->_entityName, 'p') 
     ->innerJoin('p.nursery', 'n') 
     ->where('n.id = :id') 
     ->andWhere('p.nurseryRole <> :profession') 
     ->setParameters(array('id' => $nursery_id, 'profession' => 'MANAGER')); 

    return $qb->getQuery()->getResult(); 
} 

Это, конечно, работает только, если лицо имеет питомник атрибутов, и это отображается с Doctrine ORM. Если хранилище расширяет Doctrine \ ORM \ EntityRepository можно упростить:

public function findAllStaffLinkedToANursery($nursery_id) 
{ 
    $qb = $this->createQueryBuilder('p'); 
    $qb->innerJoin('p.nursery', 'n') 
     ->where('n.id = :id') 
     ->andWhere('p.nurseryRole <> :profession') 
     ->setParameters(array('id' => $nursery_id, 'profession' => 'MANAGER')); 

    return $qb->getQuery()->getResult(); 
} 
+0

Я получаю эту ошибку: [Семантическая Error] линии 0, столбец 64 вблизи 'п ГДЕ n.id': Ошибка: Класс VS \ CrmBundle \ Entity \ Лицо не имеет никакой связи с именем питомника –

+0

может вы отправляете объект Person? Как я уже сказал, человеку нужен питомник атрибутов, если вы не присоединитесь к нему – Sepultura

0

Ok благодаря Sepultura мой код работает! Я DIT это:

public function findAllStaffLinkedToANursery($nursery_id) 
{ 
    $qb = $this->createQueryBuilder('p'); 
    $qb->innerJoin('p.nurseries', 'n') 
     ->where('n.id = :id') 
     ->andWhere('p.nurseryRole <> :profession') 
     ->setParameters(array('id' => $nursery_id, 'profession' => 'MANAGER')); 

    return $qb->getQuery()->getResult(); 
} 
Смежные вопросы