用条令优化双左多对多联接



在web应用程序中,我为ClientCaregiver之间的关系建模。由于关系包含信息,因此将其建模为两个一对多关系(如此处脚注所示)。

模型是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对象匹配。不幸的是,这不起作用:

$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匹配,而不是加入照顾者表。

背景

有关更多信息,这是我的(XML)映射:

<entity name="EntityClient" table="client" repository-class="RepositoryClient">
<id name="id" type="integer" column="id">
<generator strategy="AUTO" />
</id>
<one-to-many field="relations" target-entity="EntityRelation" mapped-by="client" />
</entity>
<entity name="EntityRelation" table="relation">
<id name="id" type="integer" column="id">
<generator strategy="AUTO" />
</id>
<many-to-one field="caregiver" target-entity="EntityCaregiver" inversed-by="relations">
<join-column name="caregiver_id" referenced-column-name="id" />
</many-to-one>
<many-to-one field="client" target-entity="EntityClient" inversed-by="relations">
<join-column name="client_id" referenced-column-name="id" />
</many-to-one>
</entity>
<entity name="EntityCaregiver" table="caregiver">
<id name="id" type="integer" column="id">
<generator strategy="AUTO" />
</id>
<one-to-many field="relations" target-entity="EntityRelation" mapped-by="caregiver" />
</entity>

问题

如何从查询生成器中删除第二个联接,以便MySQL只联接关系表而不联接照顾者表?

听起来你想要这个。。。

->setParameter('caregiver', $caregiver);

使用护理人员CCD_ 9。现在它正在将caregiver参数设置为实体对象,这将导致您看到的错误。

这个怎么样:

->setParameter('caregiver', $caregiver->getId());

当然,这是假设您的Caregiver实体中有一个"id"getter方法。您可能需要执行$caregiver->id,具体取决于您通常访问实体数据的方式。

相关内容

  • 没有找到相关文章

最新更新