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.
Nichts zu dem Thema verwandt. -1: / – David