Mostrando postagens com marcador Self reference doctrine. Mostrar todas as postagens
Mostrando postagens com marcador Self reference doctrine. Mostrar todas as postagens

quarta-feira, 18 de julho de 2012

Auto relacionamento no DOCTRINE

Olá amigos tudo bem? Esse artigo é para vc que precisa fazer um auto relacionamento(Self-reference) utilizando o DOCTRINE.


Existem 3 formas de relacionamentos e vamos aborda-las aqui que são:
1. Um para Um (One-To-One)
2. Um para Muitos (One-To-Many)
3. Muitos para Muitos (Many-To-Many)



Podemos facilmente ter uma referência de qualquer um desses caras, vamos aos exemplos


1. Um para Um (One-To-One Doctrine)
Estudante para mentor, só pode ter um e ele também é estudante. (arrumando o exemplo antigo)



  
  1. <?php
  2. /** @Entity */
  3. class Estudante
  4. {
  5.     // ...
  6.  
  7.     /**
  8.      * @OneToOne(targetEntity="Estudante")
  9.      * @JoinColumn(name="mentor_id", referencedColumnName="id")
  10.      */
  11.     private $mentor;
  12.  
  13.     // ...
  14. }



O uso do @JoinColumn é opcional já que seria definido por padrão então pois cnh_id e o id são os mesmos, podemos omiti-lo por padrão.


2. Um para Muitos (One-To-Many)

Imagine um caso de um forum, onde uma opinião pode receber 'n' opiniões (opinião da opinião)



  1. class ForumOpiniao {
  2.     /**
  3.      * @OneToMany(targetEntity="ForumOpiniao", mappedBy="forum_opiniao", cascade={"persist", "remove"})
  4.      */
  5.     private $filhos;
  6.     /**
  7.      * @ManyToOne(targetEntity="ForumOpiniao", inversedBy="filhos")
  8.      * @JoinColumn(name="forum_opiniao", referencedColumnName="id")
  9.      */
  10.     private $forum_opiniao;
  11. //.....
  12. }

Veja que criamos o atributo forum_opiniao que referencia a ele mesmo e os filhos para armazenar os filhos desse pai.


3. Muitos para Muitos (Many-To-Many)

Um caso onde usuarios poderiam se referenciar



  1. <?php
  2. /** @Entity */
  3. class User
  4. {
  5.     // ...
  6.     /**
  7.      * @ManyToMany(targetEntity="User", mappedBy="myFriends")
  8.      */
  9.     private $friendsWithMe;
  10.     /**
  11.      * @ManyToMany(targetEntity="User", inversedBy="friendsWithMe")
  12.      * @JoinTable(name="friends",
  13.      *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
  14.      *      inverseJoinColumns={@JoinColumn(name="friend_user_id", referencedColumnName="id")}
  15.      *      )
  16.      */
  17.     private $myFriends;
  18.     public function __construct() {
  19.         $this->friendsWithMe = new \Doctrine\Common\Collections\ArrayCollection();
  20.         $this->myFriends = new \Doctrine\Common\Collections\ArrayCollection();
  21.     }
  22.     // ...
  23. }

Básico e prático não achou?



Fonte: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/association-mapping.html