2017-08-16 113 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