2017-08-16 2 views
1

Ich habe zwei Entitäten, Land und Provinz, und ich habe eine viele-zu-Eins-Beziehung in der Provinz Einheit eingerichtet:Lehre und ManyToOne Einheit

Entity/Provinz

/** 
* @var \AppBundle\Entity\Country 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country") 
* @ORM\JoinColumn(name="ubicacionpaisid", referencedColumnName="id") 
* 
*/ 
private $ubicacionpaisid; 

Hier bekomme ich Alle Ergebnisse der Provinz Einheit mit:

$cb = $this->getDoctrine() 
     ->getEntityManager() 
     ->getRepository(Province::class) 
     ->createQueryBuilder('a'); 

Allerdings, wenn ich laufen:

var_dump($cb->getQuery()->getDQL()); 

es zurück:

string(41) "SELECT a FROM AppBundle\Entity\Province a" 

Was war ich eine Abfrage, um zu sehen erwartet, dass das Land Einheit, in der Provinz Einheit in der SQL verbindet.

Was fehlt mir?

+1

Off topic, aber statt mit var_dump, nur Dump verwenden. Seien Sie überrascht, wie sauber die Ausgabe aussieht. https://symfony.com/doc/current/components/var_dumper.html – Cerad

Antwort

1

Ich weiß, 2 Personen Antworten gab, die nur EAGER Laden des Vereins nutzen sagen. Aber ich kann das nicht empfehlen. Dies macht so viele Annahmen über Ihr Projekt und wie Sie immer dieser Verbindung beitreten möchten, egal was passiert, und kann sogar Formulare erstellen und unerwartetes Verhalten verursachen.

Außerdem zeigt der Benutzer bereits an, dass er einen benutzerdefinierten QueryBuilder-Aufruf verwendet, um die Daten zu erfassen. Warum also nicht explizit den Join verwenden?

Zum Beispiel:

$cb = $this->getDoctrine()->getEntityManager()->getRepository(Province::class) 
    ->createQueryBuilder('p') 
    ->select('p, c') 
    ->join('p.ubicacionpaisid', 'c') 
    ->getQuery() 
    ->getResult() 
; 

oder besser noch, von einer ProvinceRepository:

return $this->createQueryBuilder('p') 
    ->select('p, c') 
    ->join('p.ubicacionpaisid', 'c') 
    ->getQuery() 
    ->getResult() 
; 
+1

das funktioniert, aber ich muss "MIT" und "a.ubicacionpaisid = p.id" in Join verwenden.definitiv erkennt die Doktrin die Beziehung zwischen Entitäten nicht an. Aber nach dem Update-Schema, in PHP myadmin erscheint der Fremdschlüssel ... holen EAGER funktioniert nicht für mich. – user1185430

+0

Ich frage mich, ob es ohne das 'WITH' jetzt, dass der Fremdschlüssel erscheint. Hmm. So oder so froh, dass es funktioniert. –

+0

Ich stimme zu, dass dies die bessere Antwort ist, wenn er tatsächlich nach dem besten Weg fragt, um seine Fragen zu erstellen. Aber die Frage war, warum der SQL den Join nicht zeigte, also IMHO ist deine Antwort FALSCH. – DarkMukke

2

Dies könnte daran liegen, dass Doctrine zwei Arten von Joins hat. Ein normaler Join und ein Fetch-Join. In der Fetch-Verknüpfung erstellt Doctrine zwei verschiedene Abfragen und hydratisiert dann das Ergebnis der zweiten zurück in das Ergebnis/die Daten der ersten.

Es wird manchmal auch als Lazy Join bezeichnet. Lazy Joins sind das Standardverhalten.
können Sie dieses Verhalten ändern, indem Sie Ihre Beziehung mit fetch="EAGER" verändern

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

Wie DarkMukke sagte ...

Haben Sie versucht, die Daten zu holen?

in Ihrer Beziehung Hinzufügen holen = "EAGER"

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

Dies sollte die zugehörige Einheit als auch holen und laden.

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

+0

GJ Sie sagten buchstäblich, was ich sagte – DarkMukke

+1

wahr, es war nicht da, als ich begann, es zu schreiben. Ich gebe dir das Guthaben;) – Enumus