Немного запутался в отношениях с базами данных - Doctrine2 YAML

Я немного запутался в отношениях между такими сущностями, как manyToMany, oneToMany и т. Д.

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

Например:

manyToMany

Категория Сущность:

manyToMany:
    posts:
      targetEntity: PostEntity
      mappedBy: taxonomies

Сценарий первый:

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

Сообщение:

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"]. Но если вы удалите этот объект (уровень базы данных), установите null или удалите связанные сообщения. Как мы можем это сделать?

Сообщение:

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

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

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

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


person Canser Yanbakan    schedule 15.09.2015    source источник


Ответы (1)


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

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

При использовании параметра orphanRemoval = true Doctrine предполагает, что объекты находятся в частной собственности и НЕ будут повторно использоваться другими объектами. Если вы пренебрегаете этим предположением, ваши сущности будут удалены 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();
person Ali Emre Çakmakoğlu    schedule 15.09.2015
comment
Хорошо, но мне нужны примеры с конфигурацией yaml bebeğim. - person Canser Yanbakan; 15.09.2015