繁体   English   中英

使用Doctrine在多对多中优化双左联接

[英]Optimize double left join in many-to-many with Doctrine

在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 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM