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; 

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.

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.