Как в doctrine сделать сущность только для четния?

Имеется entityA которая мапится в таблицу tableName_A и entityB -> tableName_B. Отношение между entityA и entityB 1 к 1.

entityB - это элемент коллекции городов. Когда я пытаюсь сохранить entityA, запись создается в таблице А и в таблице Б. Как сделать так, что бы доктрина при сохранении нового объекта (entityA) не создавала новые записи в tableName_B?

entityA:
  type: entity
  table: tableName_A
  id:
    id:
      type: integer
      column: id
      generator:
        strategy: AUTO
  oneToOne:
    role:
      targetEntity: entityB
      joinColumn:
        name: cityId
        referencedColumnName: id


entityB:
  type: entity
  table: tableName_B
  readOnly: true
  id:
    id:
      type: integer
      column: id
      generator:
        strategy: AUTO
  fields:
    name:
      type: string
      column: name
    code:
      type: string
      column: code
    sort:
      type: integer
      column: sort
  • Вопрос задан
  • 268 просмотров
Решения вопроса 1
Немного не логично, связь 1 к 1 говорит о том, что каждая запись одной таблицы может быть связана только с одной записью другой таблицы. Поэтому такое поведение доктрины здесь обосновано.
Вам же необходимо для получения ожидаемого поведения реализовать связь many-to-one (много entityA могут ссылаться на одну entityB). В процессе реализации стоит учесть:

  1. На сущности entityA не должно быть настроено каскадное сохранение: docs.doctrine-project.org/projects/doctrine-orm/en...
  2. При создании сущности entityA брать уже существующую сущность entityВ из базы или использовать reference proxy
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@agr_ugraweb Автор вопроса
Спасибо за информацию, все осознал :)

Что в результате получилось:

entityA:
  type: entity
  table: tableName_A
  id:
    id:
      type: integer
      column: id
      generator:
        strategy: AUTO
  manyToOne:
    role:
      targetEntity: entityB
      joinColumn:
        name: cityId
        referencedColumnName: id
      cascade: ["persist"]


Сущность entityB осталась без изменений.
При создании entityA, мне необходимо в поле $entityA->role положить entityB.

Раньше было - я создавал сущность руками:
$entityA->role = new entityB(//params);

Сейчас стало - получаю ссылку на сущность из доктрины:
$entityA->role = $em->getReference(entityB::class, $entityBId);


Таким образом при сохранении entityA доктрина проверяет, была ли изменена связная entityB и если она не была изменена (а она не была изменена или подменена, т.к. используется ссылка), то создания/обновления записи в таблице tableName_B не происходит.
В доках доктрины это так же сказано:
This concept is called Persistence by Reachability: New entities that are found on already managed entities are automatically persisted as long as the association is defined as cascade: persist.


Спасибо Лексей Фельде за подсказку :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы