Ok so in einem Wort: Hilfe!Doctrine 2 Lazy Ladeproblem in ZF2 Projekt
Es gibt etwas, das ich nicht herausfinden kann. In ZF2 benutze ich das wunderbare Doctrine Orm Module. Alles ist perfekt, aber heute habe ich etwas Seltsames entdeckt. Ich vermute, da muss irgendwo ein Fehler sein, den ich nicht finden kann. Oder vielleicht gibt es etwas, was ich in Doktrin 2 nicht klar verstehe.
Ich habe meine Entitäten zugeordnet. Wenn ich eine Viele-zu-Eins-Beziehung ohne Angabe der Abrufoption habe, wenn ich eine Entität durch Aufrufen der Methode find() in meinem Repository erhalte, kann ich sehen, dass mein Attribut wie erwartet eine Instanz der generierten Proxyklasse enthält. Aber wenn ich den Setter auf dieses Attribut anrufe, dann enthält es immer noch die empty-Instanz der Proxy-Klasse ???
Es scheint, dass Doctrine die Instanz nicht mit meiner Entität verknüpft bekommen kann. In meinem Fall ist die Entität, die ich von der find() -Methode erhalte, der Eigentümer der Beziehung.
Wenn ich die Abrufoption für EAGER in meinem Mapping angeben, gibt die find() -Methode eine Entität mit dem Attribut zurück, das erwartungsgemäß die Instanz der Klasse enthält, die in der Relation angegeben ist.
Hat jemand jemals das gleiche Problem gehabt?
Edit: Ok, also habe ich ein neues ZF2-Projekt erstellt, um sicherzustellen, dass nichts dazwischenkommt. So habe ich zwei Entitäten Gruppen und Benutzer:
/**
* Class Group
* @package Application\Entity
* @Entity
* @Table("`group`")
*/
class Group
{
/**
* @Id
* @GeneratedValue
* @Column(type="integer", options={"unsigned"=true})
*/
private $id;
/**
* @Column(type="string")
*/
private $name;
/**
* @OneToMany(targetEntity="User", mappedBy="group")
*/
private $users;
}
/**
* Class User
* @package Application\Entity
* @Entity
* @Table(name="user")
*/
class User
{
/**
* @Id
* @GeneratedValue
* @Column(type="integer", options={"unsigned"=true})
*/
private $id;
/**
* @Column(type="string")
*/
private $firstName;
/**
* @Column(type="string")
*/
private $lastName;
/**
* @ManyToOne(targetEntity="Group", inversedBy="users")
* @JoinColumn(name="groupId", referencedColumnName="id")
*/
private $group;
}
Natürlich habe ich alle Getter und Setter in beiden Klassen habe, aber ich habe sie nicht im Beispiel setze schnell zu gehen.
Und in meinem Controller kann ich eine ganz einfache Sache, ohne die Sicht zu testen:
$user = $this->serviceLocator->get('doctrine.entitymanager.orm_default')->getRepository('Application\Entity\User')->find(1);
var_dump($user->getGroup());exit;
Die Var_dump Displays:
object(DoctrineORMModule\Proxy\__CG__\Application\Entity\Group)[367]
public '__initializer__' =>
object(Closure)[362]
public '__cloner__' =>
object(Closure)[363]
public '__isInitialized__' => boolean false
private 'id' (Application\Entity\Group) => int 1
private 'name' (Application\Entity\Group) => null
Natürlich habe ich in den Datenbank-Benutzer und Gruppen hinzugefügt und ich habe einen Benutzer mit der ID 1 in einer Gruppe in der Tabellengruppe.
Vielleicht habe ich eine Option oder etwas verpasst? Um das Doctrine-Modul zu konfigurieren, folgte ich einfach dem Dokument auf github, also gab ich hier den Annotationstreiber und das Verzeichnis für meine Entitäten und natürlich die Datenbankanmeldeinformationen.
Es klingt wie Sie etwas ziemlich einfach vermissen, aber es ist unmöglich, ohne weitere Details zu sagen. Sie könnten Ihre Frage verbessern, indem Sie Code anzeigen, insbesondere die relevanten Mapping-Direktiven und Ihre Repository-Nutzung. – timdev
Ok, ich habe einige Details hinzugefügt: Ich habe ein Mini-Projekt erstellt, um sicher zu sein, dass alles sauber ist. Ich habe den Code meiner Entitäten und meinen Test geschrieben. Noch einmal, wenn ich fetch = "EAGER" in die Benutzereinheit für die Gruppenbeziehung setze, ist alles in Ordnung. Aber ohne es ... – Bruce
Das sieht auf den ersten Blick gut aus. Also, was passiert als nächstes? Wenn "der Setter für dieses Attribut aufgerufen wird, dann enthält es immer noch die empty-Instanz der Proxy-Klasse" passiert? – timdev