2017-01-04 55 views
4

我有两个实体Person和Nursery,我有一个ManyToManyJoinTable之间的关系。我想使这个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=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的也练就了我undepended的nursery_id的工作人员。例如,id = 4的人没有与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'" 

回答

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(); 
} 

这当然只适用,如果人具有属性幼儿园,它的使用Doctrine 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其中n.id”:错误:类VS \ CrmBundle \实体\人没有协会命名幼儿园 –

+0

可以你发布人物实体?正如我所说,如果你不想加入,Person需要属性托儿所 – Sepultura

0

好感谢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(); 
}