2012-10-08 10 views
14

J'ai commencé à jouer avec la bibliothèque Doctrine ORM, et j'ai appris toutes les associations entre les tables. Donc, je suis bloqué avec des différences dans les relations unidirectionnelles et bidirectionnelles.Doctrine - OneToOne Unidirectionnel vs OneToOne Bidirectionnel

D'après ce que je comprends, la relation unidirectionnelle a la clé primaire seulement d'un côté, et ce côté possède le côté droit? Et la relation bidirectionnelle a une clé primaire dans les deux tables et donc vous pouvez avoir une relation des deux côtés, et définir des contraintes des deux côtés. Maintenant, je lis la documentation Doctrine sur les relations et vous avez: Unidirectional et Bidirectional associations.

Mais ils produisent le même SQL et les mêmes tables avec les mêmes clés-s et contraintes. Donc, je ne vois vraiment aucune différence dans ces deux. Et les deux exemples ont une clé primaire d'un côté.

Comme je l'obtiens la vraie relation bidirectionnelle devrait avoir des clés primaires dans les deux tables pointant vers l'autre table droite? Et avec un exemple donné sur la documentation de Doctrine ce n'est pas le cas. Les deux exemples donnent le même résultat et sont identiques.

Donc ce que j'ai fait, c'est ceci, disons que j'ai une entité utilisateur et carte, et que je veux que la relation soit OneToOne bidirectionnelle. La différence ici est que j'ai écrit @JoinColumn dans les deux objets/entités. Et dans l'exemple de Doctrine il n'y en a qu'un. Maintenant, je voudrais obtenir ce que je pense être une relation bidirectionnelle. Si je regarde le diagramme EER, je peux voir une ligne pointant d'un utilisateur à l'autre, et l'autre de la carte à l'utilisateur.

Donc, fondamentalement, ai-je bien compris? La documentation de Doctrine est-elle incorrecte? : D Comment la relation bidirectionnelle OneToOne apparaîtrait-elle dans un diagramme EER?

Merci!

+0

Quelqu'un? Personne? :RÉ – otporan

Répondre

12

la seule différence est dans l'interface de classe PHP, soit en présence ou en l'absence de la propriété qui pointe au propriétaire (par exemple le $customer propriété dans l'exemple Doctrine mentionné).En d'autres termes, Doctrine a juste besoin de savoir si elle doit prendre soin d'une seule propriété ($shipping) ou de deux propriétés ($cart et $customer). Il n'y a pas d'autre différence. Par conséquent, le code SQL est le même (car une clé étrangère est suffisante pour représenter une relation 1: N) et il n'y aurait aucune différence dans le diagramme EER (car dans EER vous ne résolvez généralement pas les détails d'implémentation liés à PHP).

9

Unidirectionnel et bidirectionnel n'ont rien à voir avec l'algorithme d'arrière-plan comment créer ces connexions dans la couche de base de données.

Tout ce dont ils parlent est comment les connexions peuvent être utilisées. Dans une relation unidirectionnelle, vous ne pouvez accéder à la cible que depuis un site. Une relation bidirectionnelle permet d'appeler la connexion à partir de deux (deux) côtés.

Donc dans un unidir. rel. model_a peut accéder à model_b, mais model_b ne peut pas arriver à model_a (sans travail supplémentaire). Si vous utilisez maintenant un bidir. rel les deux modèles peuvent accéder à l'autre sans problème

En termes de doctrine, une relation unidirectionnelle définit une méthode $modelA->getModelB(), mais pas une méthode $modelB->getModelA(), alors qu'une relation bidirectionnelle définit les deux méthodes (ou accesseurs, mais vous voulez les appeler)

dans un diagramme uml il ressemblerait à ceci:

unidirectional 
modelA --X------> modelB 

bidirectional 
modelA <--------> modelB