我有两个实体,国家和省,我在省实体中建立了多对一的关系:
实体/省
/**
* @var \AppBundle\Entity\Country
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country")
* @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id")
*
*/
private $ubicacionpaisid;在这里,我使用省实体获得所有结果:
$cb = $this->getDoctrine()
->getEntityManager()
->getRepository(Province::class)
->createQueryBuilder('a');但是,如果我跑:
var_dump($cb->getQuery()->getDQL());它返回:
string(41) "SELECT a FROM AppBundle\Entity\Province a"我希望看到的是将国家实体连接到SQL中的省实体的查询。
我错过了什么?
发布于 2017-08-16 13:37:40
我知道两个人给出的答案只是说要使用EAGER加载的关联。但我不能推荐。这就产生了很多关于您的项目的假设,以及您无论如何都希望加入该关联的方式,甚至可以使用表单进行起因问题并创建意想不到的行为。
另外,用户已经显示他们正在使用自定义的QueryBuilder调用来获取数据,那么为什么不显式地使用连接呢?
例如:
$cb = $this->getDoctrine()->getEntityManager()->getRepository(Province::class)
->createQueryBuilder('p')
->select('p, c')
->join('p.ubicacionpaisid', 'c')
->getQuery()
->getResult()
;或者更好的是,使用ProvinceRepository:
return $this->createQueryBuilder('p')
->select('p, c')
->join('p.ubicacionpaisid', 'c')
->getQuery()
->getResult()
;发布于 2017-08-16 11:31:59
这可能是因为Doctrine有两种类型的联接。一个普通的连接和一个提取连接。在fetch中,Doctrine将预先生成2个不同的查询,然后将第二个查询的结果水合物返回到第一个查询的结果/数据中。
它有时也被称为懒散连接。延迟联接是默认行为。
您可以通过更改与fetch="EAGER"的关系来更改此行为。
/**
* @var \AppBundle\Entity\Country
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country", fetch="EAGER")
* @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id")
*
*/发布于 2017-08-16 11:44:39
正如DarkMukke所说..。
你试着去取数据了吗?
添加您的关系fetch=“急切”
/**
* @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
https://stackoverflow.com/questions/45712271
复制相似问题