[英]Optimize double left join in many-to-many with Doctrine
在Web应用程序中,我为Client
和Caregiver
之间的关系建模。 由于关系中包含的信息,这被建模为两个一到多的关系(如在脚注中提到这里 )。
该模型是“ Client <-> Relation <-> Caregiver
,要查询来自特定照顾者的所有客户,查询生成器的调用方式如下(在Client
的存储库内):
$qb = $this->createQueryBuilder('c');
$qb->leftJoin('c.relations', 'r')
->leftJoin('r.caregiver', 'ca')
->andWhere('ca.id = :id')
->setParameter('id', $caregiver->getId());
$qb->getQuery()->getResult();
最佳化
此刻此作品 。 但是,似乎没有必要加入看护者,因为您可以简单地说r.caregiver
应该与$caregiver
r.caregiver
对象匹配。 不幸的是,这不起作用:
$qb = $this->createQueryBuilder('c');
$qb->leftJoin('c.relations', 'r')
->andWhere('r.caregiver = :caregiver')
->setParameter('caregiver', $caregiver);
$qb->getQuery()->getResult();
这会引发致命错误:
可捕获的致命错误:Entity \\ Carer类的对象无法转换为字符串
我要实现的是Doctrine将r.caregiver_id
与$caregiver_id
r.caregiver_id
匹配,而不是加入r.caregiver_id
表。
背景
有关更多信息,这是我的(XML)映射:
<entity name="Entity\Client" table="client" repository-class="Repository\Client">
<id name="id" type="integer" column="id">
<generator strategy="AUTO" />
</id>
<one-to-many field="relations" target-entity="Entity\Relation" mapped-by="client" />
</entity>
<entity name="Entity\Relation" table="relation">
<id name="id" type="integer" column="id">
<generator strategy="AUTO" />
</id>
<many-to-one field="caregiver" target-entity="Entity\Caregiver" inversed-by="relations">
<join-column name="caregiver_id" referenced-column-name="id" />
</many-to-one>
<many-to-one field="client" target-entity="Entity\Client" inversed-by="relations">
<join-column name="client_id" referenced-column-name="id" />
</many-to-one>
</entity>
<entity name="Entity\Caregiver" table="caregiver">
<id name="id" type="integer" column="id">
<generator strategy="AUTO" />
</id>
<one-to-many field="relations" target-entity="Entity\Relation" mapped-by="caregiver" />
</entity>
题
如何从查询构建器中删除第二个联接,以便MySQL仅联接关系表而不联接看护者表?
听起来你想要这个...
->setParameter('caregiver', $caregiver);
...使用看护人id
。 现在,它将caregiver
参数设置为实体对象,这会导致您看到错误。
那么呢:
->setParameter('caregiver', $caregiver->getId());
当然,这假定您的照护者实体中具有“ id”获取方法。 您可能需要执行$caregiver->id
具体取决于您通常如何访问实体数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.