2015-09-15 2 views
1

Я немного запутался об отношениях между сущностями, как manyToMany, oneToMany и т.д.Немного запутались базы данных отношений - Doctrine2 YAML

Что я запутался о точно, если я удалить или удалить запись из базы данных , как мы можем сказать, удалить реляционные сущности.

Например:

manyToMany

Категория Entity:

manyToMany: 
    posts: 
     targetEntity: PostEntity 
     mappedBy: taxonomies 

Сценарий один:

Если удалить или удалить одну из этих категорий, немедленно удалить все отношения в post_taxonomy_relations таблице , Что мы можем использовать для этого? Каскад или Orphanremoval?

Сообщение Entity:

manyToMany: 
    taxonomies: 
     targetEntity: TaxonomyEntity 
     inversedBy: posts 
     joinTable: 
     name: post_taxonomy_relations 
     joinColumns: 
      post_id: 
      referencedColumnName: id 
     inverseJoinColumns: 
      taxonomy_id: 
      referencedColumnName: id 

Сценарий два:

Если вы только удалить (в децибелах) одну из этих записей, удалять связанный объект в post_taxonomy_relations

oneToMany & ManyToOne

Почтовый шаблон:

oneToMany: 
    products: 
     targetEntity: PostEntity 
     cascade: ["remove"] 
     mappedBy: post_template 
     joinColumn: 
     name: id 
     referencedColumnName: template_id 

Сценарий один:

Если удалить один из этих объектов, удалить соответствующие должности либо. Работает с cascade: ["remove"]. Но если вы удалите этот объект (уровень db), установите значение null или удалите связанные сообщения. Как мы можем это сделать?

Сообщение Entity:

manyToOne: 
    template: 
     targetEntity: PostTemplateEntity 
     inversedBy: products 
     joinColumn: 
     name: template_id 
     referencedColumnName: id 

Если удалить или удалить этот пост, ничего не делать.

Хорошо, я пытаюсь привыкнуть к этим каскадным операциям.

Каждый ответ, в котором есть образцы, наиболее ценен для меня. Спасибо.

ответ

3

Каскадные операции выполняются в памяти. Это означает, что коллекции и связанные с ними объекты извлекаются в память, даже если они все еще отмечены как ленивые, когда будет выполняться каскадная операция.

полагаться на операции каскадного уровня базы данных для операции удаления вместо этого, вы можете настроить каждый столбец присоединиться с опцией OnDelete, установив его КАСКАДА.

При использовании опции orphanRemoval = true Доктрина делает предположение, что объекты находятся в частной собственности и НЕ будут повторно использоваться другими объектами. Если вы пренебрегаете этим предположением, ваши сущности будут удалены Doctrine, даже если вы назначили осиротевшего объекта другому.

на основе шаблона, вы можете попробовать:

oneToMany: 
    products: 
    targetEntity: PostEntity 
    mappedBy: post_template 
    joinColumn: 
     name: id 
     referencedColumnName: template_id 
     onDelete: CASCADE 


manyToOne: 
    template: 
    targetEntity: PostTemplateEntity 
    inversedBy: products 
    cascade: ["remove"] 
    joinColumn: 
     name: template_id 
     referencedColumnName: id 

Во многих ко многим отношений я понятия не имею, в зависимости от конфигурации YAML. Только я знаю это вручную, например:

foreach ($user->getRoles() as $role) { 
    $user->removeRole($role) 
} 
$em->remove($user); 
$em->flush(); 
+0

Хорошо, но мне нужны примеры с конфигурацией yaml bebeğim. –

+0

Обновлен мой ответ :) –

Смежные вопросы