2017-01-04 12 views
4

私は2つのエンティティPersonとNurseryを持っており、それらの間にManyToManyの関係がJoinTableです。 staff_idとスタッフを見つけ、彼はにリンクされていることを確認してください)Doctrineクエリービルダーが間違った結果を返しました

1)すべてのスタッフ(=人)が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で保育園にリンクして下さい:私はこの2つのSQLクエリを作成したいです

1)

:そのために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'; 

と保育園は、私がPersonRepositoryで、この2つのクエリを持っています

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の気にしない、それは私にnursery_idのundependedスタッフを与えることの両方のケースで

。たとえば、id = 4のPersonは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

は、多分それはあなたが保育園エンティティに参加する方法方法です。 このような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(); 
} 

このコースの人だけが属性保育園を持っている場合、動作し、それが教義ORMにマッピングされています。リポジトリが教義を拡張する場合は \ 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

私はこのエラーを取得:[意味論的エラー]行0、列を64近くの 'n WHERE n.id':エラー:クラスVS \ CrmBundle \エンティティ\人保育園 –

+0

ができるという名前の関連性を持っていませんあなたはPersonエンティティを投稿しますか?私が言ったように、あなたがそれに参加することを望んでいないなら、Personは属性の保育園を必要とします – Sepultura

0

[OK]を感謝を!私はこの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(); 
} 
関連する問題