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
(~7 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)