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)
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?
Fonte: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/association-mapping.html
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)
- <?php
- /** @Entity */
- class Estudante
- {
- // ...
- /**
- * @OneToOne(targetEntity="Estudante")
- * @JoinColumn(name="mentor_id", referencedColumnName="id")
- */
- private $mentor;
- // ...
- }
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?
Fonte: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/association-mapping.html
Caracaa brother valeu mesmo pelo artigo! Foi de muita utilidade mesmo! Doctrine é bom mais no começo é demais de complexo ainda mais para devs PHP da nata.
ResponderExcluirPaulo no Muitos para Muitos sou obrigado a criar um construtor inicializando com o ArrayCollection do Doctrine? Não sei ao certo se no meu caso eu devo.
ResponderExcluirO exemplo dado para o caso um para um, não é de um auto relacionamento, pois está envolvendo duas entidades diferentes: Motorista e CNH. Auto relacionamento deve envolver instancias de uma mesma classe.
ResponderExcluirRealmente um erro bizzaro meu. Deixei passar em branco por eu estar prestando atenção apenas no n-2-n... de qualquer forma obrigado por lembrar... só espero que da próxima vez não comente como Anônimo... Críticas são bem vindas.
ExcluirVou mudar o exemplo.
Fiz isso e está dando um erro louco quando vou fazer o FindByOne, por exemplo! No meu caso eu fiz:
ResponderExcluirclass Membro_model
{
/**
* @Id @Column(type="integer")
* @GeneratedValue(strategy="IDENTITY")
*/
public $id = 0;
/**
* @Column(type="string", columnDefinition="VARCHAR(50) NOT NULL")
*/
public $nome = 0;
/**
* @Column(type="string", columnDefinition="VARCHAR(12) NOT NULL")
*/
public $login = 0;
/**
* @OneToOne(targetEntity="Membro_model")
* @JoinColumn(name="patrocinador_id", referencedColumnName="id")
**/
public $patrocinador;
}
Quando vou puxar linhas em que a coluna id_patrocinador da tabela não é nula, ele dá pau! Eu fiz:
$membro = $this->doctrine->em->getRepository('Membro_model')->findBy(array('login' => $login));
Não funciona! Saberia como resolver? Se puder agradeço: anderson.cavalcanti.rn@gmail.com