【问题标题】:Optimize double left join in many-to-many with Doctrine使用 Doctrine 优化多对多中的双左连接
【发布时间】:2014-01-03 14:35:35
【问题描述】:

在一个 Web 应用程序中,我为 ClientCaregiver 之间的关系建模。因为关系包含信息,所以这被建模为两个一对多关系(如脚注 here 中所述)。

模型是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,而不是加入 caregivers 表。

背景

有关更多信息,这是我的 (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 仅连接关系表而不连接 caregivers 表?

【问题讨论】:

    标签: php join doctrine-orm associations


    【解决方案1】:

    听起来你想要这个......

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

    ...使用看护者id。现在它正在将caregiver 参数设置为实体对象,这会导致您看到的错误。

    那么这个怎么样:

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

    这当然假设您的 Caregiver 实体中有一个“id”getter 方法。您可能需要改为 $caregiver-&gt;id,具体取决于您通常访问实体数据的方式。

    【讨论】:

    • 愚蠢的我还没试过!谢谢,这行得通。我在 Doctrine 手册中找不到这个东西,有没有提到过?
    • 不确定手册。只是按照你得到的错误,很明显,Doctrine 在映射参数时期望一个简单的值而不是一个对象。
    • 这是因为Doctrine says this:“调用 setParameter() 会自动推断您设置为值的类型。这适用于整数、字符串/整数数组、DateTime 实例和托管实体。” (并且看护者是一个托管实体):) 无论如何,现在并不重要!
    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2016-02-16
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多