我有两个实体,国家和省,我在省实体中建立了多对一关系:
实体/省份
/**
* @var AppBundleEntityCountry
* @ORMManyToOne(targetEntity="AppBundleEntityCountry")
* @ORMJoinColumn(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 AppBundleEntityProvince a"
我希望看到的是一个将国家/地区实体加入 SQL 中的省实体的查询。
我错过了什么?
这可能是因为 Doctrine 有 2 种类型的连接。 正常联接和提取联接。在获取连接中,Doctrine 将执行 2 个不同的查询,然后将第二个查询的结果水化回第一个查询的结果/数据。
它有时也称为延迟联接。延迟联接是默认行为。
您可以通过改变与fetch="EAGER"
的关系来更改此行为
/**
* @var AppBundleEntityCountry
* @ORMManyToOne(targetEntity="AppBundleEntityCountry", fetch="EAGER")
* @ORMJoinColumn(name="ubicacionpaisid", referencedColumnName="id")
*
*/
我意识到 2 个人给出的答案只是说使用EAGER
加载关联。 但我不能推荐。 这对您的项目以及无论如何您始终希望加入该协会的方式做出了许多假设,甚至可能导致表单问题和创建意外行为。
另外,用户已经表明他们正在使用自定义 QueryBuilder 调用来获取数据,那么为什么不显式使用联接呢?
例如:
$cb = $this->getDoctrine()->getEntityManager()->getRepository(Province::class)
->createQueryBuilder('p')
->select('p, c')
->join('p.ubicacionpaisid', 'c')
->getQuery()
->getResult()
;
或者更好的是,从省存储库:
return $this->createQueryBuilder('p')
->select('p, c')
->join('p.ubicacionpaisid', 'c')
->getQuery()
->getResult()
;
正如DarkMukke所说...
您是否尝试获取数据?
添加您的关系 fetch="EAGER">
/**
* @var AppBundleEntityCountry
* @ORMManyToOne(targetEntity="AppBundleEntityCountry", fetch="EAGER")
* @ORMJoinColumn(name="ubicacionpaisid", referencedColumnName="id")
*
*/
private $ubicacionpaisid;
这也应该获取和加载关联的实体。
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#manytoone