Php 条令查询生成器给出错误的结果

Php 条令查询生成器给出错误的结果,php,mysql,doctrine-orm,Php,Mysql,Doctrine Orm,我有两个实体,一个人和托儿所,它们之间有一个manytomy关系,具有一个JoinTable。我想进行以下两个sql查询: 1) 查找具有托儿所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 &

我有两个实体,一个人和托儿所,它们之间有一个
manytomy
关系,具有一个
JoinTable
。我想进行以下两个sql查询:

1) 查找具有托儿所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';
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';
从p.id=ns.staff\u id上的人员p内部加入托儿所\u staff ns中选择p.*ns.托儿所\u id=n.id,其中n.id=1和p.托儿所\u staff\u角色“经理”;
2) 找到具有员工id的员工,并确保他已链接到具有托儿所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';
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';
从p.id=ns.staff\u id上的人员p内部加入托儿所\u staff ns中选择p.*在ns.托儿所\u id=n.id上的人员p内部加入托儿所n,其中n.id=2和p.id=4,以及p.托儿所\u staff\u角色“经理”;
为此,我在PersonRepository中有两个查询:

(一)

公共函数findallstafflinkedtoapery($trury\u id)
{
$qb=$this->_em->createQueryBuilder();
$qb->选择('p')
->from($this->\u entityName,'p')
->innerJoin('VSCrmBundle:nurry','n')
->其中('n.id=:id')
->何处(‘p.Nurserroyle:职业’)
->setParameters(数组('id'=>$托儿所id,'profession'=>'MANAGER');
返回$qb->getQuery()->getResult();
}
(二)

公共函数findOneByNurseryAndStaffId($托儿所id,$staff\u id)
{
$qb=$this->_em->createQueryBuilder();
$qb->选择('p')
->from($this->\u entityName,'p')
->innerJoin('VSCrmBundle:nurry','n')
->其中('p.id=:pid')
->andWhere('n.id=:nid')
->andWhere('p.nurserroyle:staffRole')
->设置参数(数组)(
“pid”=>$staff\u id,
'nid'=>$托儿所id,
“员工角色”=>“经理”
));
返回$qb->getQuery()->getOneOrNullResult();
}
但在这两种情况下,查询都不关心托儿所id,这使我得到了不依赖托儿所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'"
php-bin/console原则:query:dql“从VSCrmBundle中选择p.email:Person p-internal-join-VSCrmBundle:托儿所n,其中n.id=2和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();
}
公共函数findallstafflinkedtoapery($trury\u id)
{
$qb=$this->_em->createQueryBuilder();
$qb->选择('p')
->from($this->\u entityName,'p')
->innerJoin('p.nursery','n')
->其中('n.id=:id')
->何处(‘p.Nurserroyle:职业’)
->setParameters(数组('id'=>$托儿所id,'profession'=>'MANAGER');
返回$qb->getQuery()->getResult();
}
当然,这只有在Person具有属性Turbery并使用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();
}
公共函数findallstafflinkedtoapery($trury\u id)
{
$qb=$this->createQueryBuilder('p');
$qb->innerJoin('p.nurry','n')
->其中('n.id=:id')
->何处(‘p.Nurserroyle:职业’)
->setParameters(数组('id'=>$托儿所id,'profession'=>'MANAGER');
返回$qb->getQuery()->getResult();
}

好的,多亏了SeCultura,我的代码才行!我认为:

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();
}
公共函数findallstafflinkedtoapery($trury\u id)
{
$qb=$this->createQueryBuilder('p');
$qb->innerJoin('p.nurries','n')
->其中('n.id=:id')
->何处(‘p.Nurserroyle:职业’)
->setParameters(数组('id'=>$托儿所id,'profession'=>'MANAGER');
返回$qb->getQuery()->getResult();
}

我收到此错误:[语义错误]第0行,第64列靠近'n WHERE n.id':错误:Class VS\CrmBundle\Entity\Person没有名为nurserycan的关联可以发布Person实体吗?正如我所说的,如果你不想加入,这个人需要属性托儿所