+2

Auto relacionamento no DOCTRINE

criado por Paulo Victor Gomes em 18/07/2012 3:57pm
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)
Imagine um caso de uma entidade motorista onde precisamos referenciar um cnh que seria outra entidade e lá iriam constar mais informações como vencimento da mesma, pontos e etc... a relação seria Um para Um então poderiamos fazer assim:

    <?php
   
/** @Entity */
   
class Motorista
   
{
       
// ...
     
       
/**
         * @OneToOne(targetEntity="Motorista")
         * @JoinColumn(name="cnh_id", referencedColumnName="id")
         */

       
private $cnh;
     
       
// ...
   
}

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)


    class ForumOpiniao {
     
       
/**
         * @OneToMany(targetEntity="ForumOpiniao", mappedBy="forum_opiniao", cascade={"persist", "remove"})
         */

       
private $filhos;
     
       
/**
         * @ManyToOne(targetEntity="ForumOpiniao", inversedBy="filhos")
         * @JoinColumn(name="forum_opiniao", referencedColumnName="id")
         */

       
private $forum_opiniao;
     
   
//.....
     
   
}

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


    <?php
   
/** @Entity */
   
class User
   
{
       
// ...
     
       
/**
         * @ManyToMany(targetEntity="User", mappedBy="myFriends")
         */

       
private $friendsWithMe;
     
       
/**
         * @ManyToMany(targetEntity="User", inversedBy="friendsWithMe")
         * @JoinTable(name="friends",
         *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
         *      inverseJoinColumns={@JoinColumn(name="friend_user_id", referencedColumnName="id")}
         *      )
         */

       
private $myFriends;
     
       
public function __construct() {
            $this
->friendsWithMe = new \Doctrine\Common\Collections\ArrayCollection();
            $this
->myFriends = new \Doctrine\Common\Collections\ArrayCollection();
       
}
     
       
// ...
   
}

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

Comentários:

Mostrando 1 - 2 de 2 comentários
Obrigado por compartilhar esse conhecimento 1<a href="http://conteudodigitalonline.com.br/">mini sites de sucesso</a>
10/03/2018 9:35am (~7 anos atrás)

Dangda disse:
Obrigado por tomar o tempo para discutir isso, eu sinto fortemente sobre ele e adoro aprender mais sobre este tema. Se possível, como você ganhar experiência, você se importaria de atualizar seu blog com mais informações? É extremamente útil para mim ... obrigado
http://verchini.com/vi-nam
17/01/2013 8:32pm (~12 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)