Auto relacionamento no 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)
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:
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)
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
Básico e prático não achou?
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?
Obrigado por compartilhar esse conhecimento 1<a href="http://conteudodigitalonline.com.br/">mini sites de sucesso</a>
10/03/2018 9:35am
(~6 anos atrás)
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
http://verchini.com/vi-nam
17/01/2013 8:32pm
(~12 anos atrás)