首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主义与ManyToOne实体

主义与ManyToOne实体
EN

Stack Overflow用户
提问于 2017-08-16 11:24:50
回答 3查看 384关注 0票数 1

我有两个实体,国家和省,我在省实体中建立了多对一的关系:

实体/省

代码语言:javascript
复制
/**
 * @var \AppBundle\Entity\Country
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country")
 * @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id")
 *
 */
private $ubicacionpaisid;

在这里,我使用省实体获得所有结果:

代码语言:javascript
复制
 $cb = $this->getDoctrine()
        ->getEntityManager()
        ->getRepository(Province::class)
        ->createQueryBuilder('a');

但是,如果我跑:

代码语言:javascript
复制
 var_dump($cb->getQuery()->getDQL());

它返回:

代码语言:javascript
复制
string(41) "SELECT a FROM AppBundle\Entity\Province a"

我希望看到的是将国家实体连接到SQL中的省实体的查询。

我错过了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-16 13:37:40

我知道两个人给出的答案只是说要使用EAGER加载的关联。但我不能推荐。这就产生了很多关于您的项目的假设,以及您无论如何都希望加入该关联的方式,甚至可以使用表单进行起因问题并创建意想不到的行为。

另外,用户已经显示他们正在使用自定义的QueryBuilder调用来获取数据,那么为什么不显式地使用连接呢?

例如:

代码语言:javascript
复制
$cb = $this->getDoctrine()->getEntityManager()->getRepository(Province::class)
    ->createQueryBuilder('p')
    ->select('p, c')
    ->join('p.ubicacionpaisid', 'c')
    ->getQuery()
    ->getResult()
;

或者更好的是,使用ProvinceRepository:

代码语言:javascript
复制
return $this->createQueryBuilder('p')
    ->select('p, c')
    ->join('p.ubicacionpaisid', 'c')
    ->getQuery()
    ->getResult()
;
票数 1
EN

Stack Overflow用户

发布于 2017-08-16 11:31:59

这可能是因为Doctrine有两种类型的联接。一个普通的连接和一个提取连接。在fetch中,Doctrine将预先生成2个不同的查询,然后将第二个查询的结果水合物返回到第一个查询的结果/数据中。

它有时也被称为懒散连接。延迟联接是默认行为。

您可以通过更改与fetch="EAGER"的关系来更改此行为。

代码语言:javascript
复制
/**
 * @var \AppBundle\Entity\Country
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country", fetch="EAGER")
 * @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id")
 *
 */
票数 2
EN

Stack Overflow用户

发布于 2017-08-16 11:44:39

正如DarkMukke所说..。

你试着去取数据了吗?

添加您的关系fetch=“急切”

代码语言:javascript
复制
/**
 * @var \AppBundle\Entity\Country
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country", fetch="EAGER")
 * @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id")
 *
 */
private $ubicacionpaisid;

这也应该获取和加载相关的实体。

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#manytoone

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45712271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档