2016-05-03 6 views
1

Zunächst einmal hier ist, was ich habe:Symfony Lehre Beziehungen noch partials auf DQL arbeitet

DeviceContentUpdate Einheit:

Bundle\Entity\DeviceContentUpdate: 
    type: entity 
    table: device_content_updates 
    repositoryClass: ... 
    id: 
     id: 
     type: integer 
     id: true 
     generator: 
      strategy: AUTO 
    fields: 
     ... 
     deviceId: 
     type: integer 
     column: device_id 
     nullable: true 
    manyToOne: 
     relDevice: 
     targetEntity: Device 
     inversedBy: relDeviceContentUpdates 
     joinColumn: 
      name: device_id 
      referencedColumnName: id 

Geräte Einheit:

Bundle\Entity\Device: 
    type: entity 
    table: devices 
    repositoryClass: ... 
    id: 
    id: 
     type: integer 
     id: true 
     generator: 
      strategy: AUTO 
    fields: [...] 
    oneToMany: 
    relDeviceContentUpdates: 
     targetEntity: DeviceContentUpdate 
     mappedBy: relDevice 

Jetzt Wenn ich versuche, ein Element per ID mit QueryBuilder zu holen, kann ich keine richtige JOIN-Klausel erstellen, was bedeutet, dass i t verbindet alle Datensätze im Fall einer Viele-zu-Eins-Beziehung.

Beispiel 1:

$result = $deviceContentUpdateRepository 
    ->createQueryBuilder('mt') 
    ->select('mt') 
    ->leftJoin('Bundle:Device', 'd') 
    ->where('mt.id = ?0') 
    ->setParameter(0, $id) 
    ->getQuery()->getResult(); 

: Liste der DeviceContentUpdate Artikel mit so viel Elemente wie es im Geräte-Einheit der Tabelle sind.

Erwartetes Ergebnis 1: Liste mit einem DeviceContentUpdate-Objekt einschließlich zugehörigem Device-Element, auf das mit relDevice() zugegriffen werden kann. Ich weiß, ich kann Objekt ohne Join-Klausel holen und Lazy Loader verwenden, dies dient nur zur Veranschaulichung der Situation.

Beispiel 2:

$result = $deviceContentUpdateRepository 
    ->createQueryBuilder('mt') 
    ->select('mt') 
    ->leftJoin('Bundle:Device', 'd', 'WITH', 'd.id = mt.deviceId') 
    ->where('mt.id = ?0') 
    ->setParameter(0, $id) 
    ->getQuery()->getResult(); 

: erwartetes Ergebnis aus Beispiel 1

Beispiel 3:

$result = $deviceContentUpdateRepository 
    ->createQueryBuilder('mt') 
    ->select('mt, partial d.{id,name}') 
    ->leftJoin('Bundle:Device', 'd', 'WITH', 'd.id = mt.deviceId') 
    ->where('mt.id = ?0') 
    ->setParameter(0, $id) 
    ->getQuery()->getResult(); // mode HYDRATE_OBJECT 

Ergebnis 3: Liste von zwei Elementen, 0 Element ist DeviceContentUpdate, 1 Element ist Proxy des Geräts.

Erwartetes Ergebnis 3: Liste eines DeviceContentUpdate-Elements.

Ich bin wirklich verwirrt, denn alle Handbücher und Beispiele sagen, dass es keinen Grund gibt, WITH in JOIN-Klauseln zu verwenden, wenn nur FKs zugeordnet sind, aber in meinem Fall verbindet es alles, wenn ich es nicht verwende. Auch bekomme ich alle meine Haare mit Teiltönen aus dem Kopf. Wörtlich haben keine Ahnung von diesem Verhalten.

Antwort

2

Sie sollten dies versuchen, dieses Beispiel funktioniert.

$query = $em->createQueryBuilder() 
    ->from('Embed', 'e') 
    ->select("e") 
    ->leftJoin("User", "u", "WITH", "e.uid=u.id") 
    ->leftJoin("Product", "p", "WITH", "e.pid=p.id") 
    ->where("u.image > 0 OR p.image > 0") 
    ->addOrderBy("COALESCE(u.timeCreated, p.timeCreated)", "DESC") 
    ->setMaxResults(28) 
    ->getQuery(); 

Danke.

+0

Nichts zu dem Thema verwandt. -1: / – David