Tentei reunir poucas informações sobre as seguintes maneiras de excluir automaticamente a entidade filha quando uma entidade pai é excluída. Parece que a forma mais comum é usar uma das três anotações: cascade = {"remove"} OR órfãoRemoval = true OR ondelete = "CASCADE" .
Estou um pouco confuso sobre o terceiro: ondelete = "CASCADE" , pois as explicações na documentação oficial de doutrina sobre este são muito escassas) e adoraria se alguém pudesse me confirmar as seguintes informações que reuni e entendi da minha pesquisa sobre o rede e experiência ...
O QUE FAZ
cascade = {"remove"}
==> a entidade no lado inverso é excluída quando a entidade do lado proprietário é. Mesmo se você estiver em um muitostomany com outra entidade lateral proprietária.
- deve ser usado na coleta (no relacionamento OneToMany ou ManyToMany)
- implementação no ORM
órfãoRemoval = true
==> a entidade no lado inverso é excluída quando a entidade do lado proprietária é E não está mais conectada a nenhuma outra entidade lateral proprietária. (ref. doctrine official_doc
- implementação no ORM
- pode ser usado com OneToOne, OnetoMany ou ManyToMany
onDelete = "CASCADE"
==> isso adicionará On Delete Cascade à coluna de chave estrangeira no banco de dados
- Esta estratégia é um pouco complicada de se acertar, mas pode ser muito poderosa e rápida. (ref. doutrina oficial_doc ... mas não li mais explicações)
- ORM tem que fazer menos trabalho (em comparação com as duas formas anteriores de fazer) e, portanto, deve ter melhor desempenho.
outras informações
- todas essas 3 maneiras de fazer são implementadas em entidades de relacionamento bidirecionais ( certo ??? )
- usando cascade = {"remover"} ignora completamente qualquer chave estrangeira onDelete = CASCADE. (ref. doctrine_official_doc )
EXEMPLO DE COMO USAR EM CÓDIGO
- órfãoRemoval e cascata = {"remover"} são definidos na classe de entidade inversa.
- ondelete = "CASCADE" é definido na entidade proprietária
- você também pode apenas escrever @ORM \ JoinColumn (onDelete = "CASCADE") e deixar a doutrina lidar com os nomes das colunas
cascade = {"remover"}
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers
órfãoRemoval = true
/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true)
*/
protected $Phonenumbers
onDelete = "CASCADE"
/**
* @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
* @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
*/
protected $contact;
Respostas:
onDelete="CASCADE"
é gerenciado pelo próprio banco de dados.cascade={"remove"}
é administrado pela doutrina.onDelete="CASCADE"
é mais rápido porque as operações são realizadas no nível do banco de dados, em vez de por doutrina. A remoção é realizada pelo servidor de banco de dados e não pelo Doctrine. Com acascade={"remove"}
doutrina tem que gerir a própria entidade e vai realizar verificações extras para ver se não tem outras entidades proprietárias. Quando não houver outra, ele excluirá a entidade. Mas isso cria uma sobrecarga.cascade = {"remover"}
órfãoRemoval = "verdadeiro"
onDelete = "CASCADE"
fonte