2017-08-16 119 views
1

我有两个实体,国家和省,我已经设立在省实体许多到一个关系:主义和多对一实体

实体/省

/** 
* @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省实体的查询。

我错过了什么?

+1

关闭,而不是使用的var_dump话题,但是,只要使用转储。对输出看起来很干净感到惊讶。 https://symfony.com/doc/current/components/var_dumper.html – Cerad

回答

1

我知道2人给出的答案,只是说使用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() 
; 
+1

这个工程,但我必须使用“WITH”和“a.ubicacionpaisid = p.id”加入。当然,学说并不承认实体之间的关系。但更新架构后,在PHP myadmin出现外键...取EAGER不适合我。 – user1185430

+0

我想知道现在没有'WITH'这个外键出现了。嗯。无论哪种方式很高兴它的工作。 –

+0

我同意这是更好的答案,如果他实际上是要求最好的方式来建立他的查询。但问题是为什么SQL没有显示连接,所以恕我直言,你的答案是错误的。 – DarkMukke

2

这可能是因为Doctrine有两种类型的连接。 正常联接和取数联接。在提取连接中,Doctrine将执行2个不同的查询,然后将第二个结果保存为第一个结果/数据。

它有时也被称为延迟连接。延迟连接是默认行为。
您可以通过改变与fetch="EAGER"

/** 
* @var \AppBundle\Entity\Country 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country", fetch="EAGER") 
* @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id") 
* 
*/ 
0

正如DarkMukke说你的关系,改变这种行为......

你尝试获取数据?

添加你的联系取=“心切”

/** 
* @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

GJ你从字面上说我说的 – DarkMukke

+1

是真的,当我开始写它时,它不在那里。我给你的信用;) – Enumus