cascata = {“remover”} VS órfãoRemoval = verdadeiro VS ondelete = "CASCADE

92

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; 
Alexis_D
fonte
1
tem uma boa explicação stackoverflow.com/questions/25515007/…
Gregsparrow

Respostas:

60

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 a cascade={"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"}

  • 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. Não, se a entidade pertencer a outra pessoa. Não será excluído.
  • deve ser usado na coleta (no relacionamento OneToMany ou ManyToMany)
  • implementação no ORM

órfãoRemoval = "verdadeiro"

  • 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. Não exatamente, isso faz com que a doutrina se comporte como se não fosse propriedade de outra entidade, e assim a remova.
  • implementação no ORM
  • pode ser usado com OneToOne, OnetoMany ou ManyToMany

onDelete = "CASCADE"

  • isso adicionará On Delete Cascade à coluna de chave estrangeira NA BASE DE DADOS
  • Essa estratégia é um pouco complicada de acertar, mas pode ser muito poderosa e rápida. (esta é uma citação do tutorial oficial de doutrina ... mas não vi muito mais explicação)
  • ORM tem que fazer menos trabalho (em comparação com as duas formas anteriores de fazer) e, portanto, deve ter melhor desempenho.
Waaghals
fonte
3
@ waaghals. Sobre seus comentários no cascade = {"remove"} ==> Eu tenho um relacionamento ManyToMany entre a entidade Artigo e Categoria. Quando eu removo um Artigo ($ em-> remove ($ article);), ele remove todas as categorias vinculadas a este artigo MESMO se essas categorias também estiverem vinculadas a outros artigos. então eu diria que ele não se comporta enquanto você escreve.
Alexis_D
2
@ waaghals. Sobre seus comentários sobre o órfãoRemoval = "true" A frase que escrevi "a entidade no lado inverso é excluída quando a entidade do lado proprietária é, e não é propriedade de nenhuma outra entidade" é citada nas páginas oficiais da doutrina. doutrina = remoção de órfãos .
Alexis_D
1
@Alexis_D, concordo plenamente com seus comentários A resposta está incorreta e pode ser muito confusa para iniciantes
Stepan Yudin
3
Um dos exemplos mais claros que li: gist.github.com/pylebecq/f844d1f6860241d8b025
Victor S
O link de @VictorS é muito claro. Não estou mais trabalhando com o Doctrine, então sinto que não posso atualizar minha resposta sem saber em primeira mão como funciona. Se alguém pudesse atualizar minha resposta, isso seria ótimo.
Waaghals de