Doctrine 1.2 : Relation’s getters return Null or non-persistants object.

15 décembre 2012 par: Benoit Bonneville

Les relations obtenues depuis des objets doctrine dépendent de la manière dont vous avez instancié cet objet.

Prerequis

Doctrine est un ORM PHP, c’est à dire que chaque entrée dans une base de données peu être représentée par un objet.
Vous pouvez obtenir les relations de cet objet par des méthodes appelés getters.

Petit rappel, dans un ORM la persistance est l’état d’un objet qui indique si il existe en base de donnée ou non.

Comportement d’un getter de relation.

Nous nous plaçons dans le cas ou Vous utilisez un objet persistant et que vous souhaitez appeler une relation qui n’existe pas encore.
Comme ceci :
$object->getMyRelation();

Précision :
$object est un objet persistant
MyRelation attendu n’est pas présent en base de données
Cette relation est de type « One », c’est à dire que nous attendons un Doctrine_Record et non une Doctrine_Collection.

Le résultat de cette méthode dépend de la manière d’instancier l’objet $object.

1er Cas : Relation non persistante.

Si l’objet a été chargé sans jointure sur « myRelation » ou tout simplement crée, alors getMyRelation(); vous retournera un objet de type MyRelation, qui sera non persistant.
C’est à dire que le getter va faire un « new MyRelation(); » (donc non-enregistré en base de de données)

2ème cas: relation Null
Par contre si votre $object a été instancié avec une jointure (leftjoin ) sur MYRelation alors getMyRelation(); renverra NULL.

Libre à vous de créer la relation et de la lier à votre object.
$object->setMyRelation(new MYrelation());

En pratique

// premier cas

$object = Doctrine::getTable(object)->find(1);
print_r($object->toarray());
/*
Array(
[id] => 1
[MyRelation] => Array(
[id] =>
);
);
*/

// second cas

$object = Doctrine_Query::create()
->from('Object o')
->leftjoin('o.MYRelation')
->where('o.id = ?',1)
->findOne();
print_r($object->toarray());
/*
Array(
[id] => 1
[MyRelation] => NULL
)
*/

Vous pouvez donc être surpris dans une application ou vous ne savez pas comment vos objet ont été créés.

Filed under: Non classé

Répondre