Doctrine2 - (如何)使用 main 获取关联对象

Posted

技术标签:

【中文标题】Doctrine2 - (如何)使用 main 获取关联对象【英文标题】:Doctrine2 - (how to) fetch associated objects with main 【发布时间】:2011-09-01 09:57:04 【问题描述】:

假设我在 Doctrine2 中有一个关联映射。

如何定义在查询主要对象时需要获取所有关联对象

实际上,如果我定义 (Main 1-* Sub) 然后访问 Sub 集合中的所有项目,Doctine 将执行单个 DB 请求以获取每个 Sub 对象。我需要在主查询 (JOIN) 中检索子对象。

欢迎评论或(最好)Doctrine RTM)

【问题讨论】:

【参考方案1】:

如果您经常需要它(即始终获取所有关联),请声明您的关联 eager。详情请咨询Doctrine manual第17-19章。

如果您只需要几段代码 - 使用 DQL 查询它们 (manual)。这样您就必须指定所有关联。

$query = $em->createQuery("SELECT u, a FROM User u JOIN u.address a WHERE a.city = 'Berlin'");
$users = $query->getResult();

如果您要经常使用该查询,最好将其封装在 Entity 类中(简单,但不是最佳解决方案),或为实体创建 Repository(涉及更多一点,但“正确的方式”)。

【讨论】:

【参考方案2】:

用户存储库

public function getUsersFromCity($city): Collection

  return $this->createQueryBuilder('u')
    ->leftJoin('u.address', 'a')
    ->addSelect('a')
    ->andWhere('a.city = :city')
    ->setParameter('city', $city)
    ->getQuery()
    ->getResult()
  ;


【讨论】:

以上是关于Doctrine2 - (如何)使用 main 获取关联对象的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 项目中的 Doctrine2 映射问题

由 Doctrine2 (Symfony2) 生成的约束中的奇怪随机名称

Zend+Doctrine2:如何使用 ArrayCollections() 正确刷新实体?

如何使用Doctrine2将实体的克隆保存为更新

如何在Doctrine2中为单个实体使用多个存储库?

如何更改 Doctrine2 CTI 继承中的实体类型