+1

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 - 1 de 1 comentários
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 (~3 anos atrás)

Novo Comentário:

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