[英]Doctrine query builder gives wrong result
我有兩個實體Person和Nursery,我和JoinTable
之間有一個ManyToMany
關系。 我想做這2個SQL查詢:
1)使用nursery_id查找鏈接到托兒所的所有員工(= Person)
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';
為此我在PersonRepository中有這2個查詢:
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,這使得我的工作人員不再使用nursery_id。 例如,id = 4的Person未與id = 2的托兒所鏈接,但此查詢顯示此人。
編輯:我有與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'"
也許這就是你加入幼兒園實體的方式。 嘗試從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();
}
這當然只有在Person具有屬性托兒所並且使用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();
}
好的,謝謝Sepultura我的代碼工作! 我點了這個:
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.