Доктрина хочет сохранить уже управляемую связанную сущность

Привет, у меня есть эта настройка: Дом N-1, Пользователь N-1, Группа N-N, роль

Domain\Entity\House:
    manyToOne:
        user:
            targetEntity: Domain\Entity\User
            cascade: ["persist"]
            inversedBy: houses
            joinColumn:
                name: user_id
                referencedColumnName: id
                onDelete: CASCADE
    genre:
        targetEntity: Domain\Entity\Genre
        cascade: ["persist"]
        inversedBy: houses
        joinColumn:
            name: genre_id
            referencedColumnName: id
            onDelete: SET NULL

Domain\Entity\User:
  oneToMany:
    houses:
      targetEntity: Domain\Entity\House
      cascade: ["persist"]
      mappedBy: user

  manyToOne:
    group:
      targetEntity: Domain\Entity\Group
      inversedBy: users

Domain\Entity\Group:
  manyToMany:
    roles:
      targetEntity: Domain\Entity\Role
      joinTable:
        name: groups_roles
        joinColumns:
          group_id:
            referencedColumnName: id
            onDelete: CASCADE
        inverseJoinColumns:
          role_id:
            referencedColumnName: id
            onDelete: CASCADE

У меня уже есть много ролей, групп и пользователей, и когда я обновляю объект House чем-то вроде:

$userObj = $userRepo->find(3);
$house->setUser($userObj);
$houseRepo->save($house);

Все взрывается, и доктрина говорит мне следующее:

A new entity was found through the relationship 'User#group' that was not configured to cascade persist operations for entity

Итак, я отредактировал свои сопоставления, чтобы включить параметр cascade = ["настойчиво"]:

Domain\Entity\House:
    manyToOne:
        user:
            targetEntity: Domain\Entity\User
            cascade: ["persist"]
            inversedBy: houses
            joinColumn:
                name: user_id
                referencedColumnName: id
                onDelete: CASCADE
        genre:
            targetEntity: Domain\Entity\Genre
            cascade: ["persist"]
            inversedBy: houses
            joinColumn:
                name: genre_id
                referencedColumnName: id
                onDelete: SET NULL

Domain\Entity\User:
  oneToMany:
    houses:
      targetEntity: Domain\Entity\House
      cascade: ["persist"]
      mappedBy: user

  manyToOne:
    group:
      targetEntity: Domain\Entity\Group
      inversedBy: users
      cascade: ["persist"]

Domain\Entity\Group:
  manyToMany:
    roles:
      cascade: ["persist"]
      targetEntity: Domain\Entity\Role
      joinTable:
        name: groups_roles
        joinColumns:
          group_id:
            referencedColumnName: id
            onDelete: CASCADE
        inverseJoinColumns:
          role_id:
            referencedColumnName: id
            onDelete: CASCADE

Но когда я пытаюсь запустить приведенный выше PHP-код, чтобы сохранить обновленный объект House, я получил эту ошибку

An exception occurred while executing 'INSERT INTO roles (code,description) VALUES (?, ?)' with params ['ROLE_USER', null]: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'ROLE_USER' for key 'UNIQ_B63E2EC777153098'

An exception occurred while executing 'INSERT INTO genres (name, active, parent_id) VALUES (?, ?, ?)' with params [null, 1, null]: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null

Почему кажется, что Doctrine не знает, что роль, назначенная группе, назначенная пользователю, уже существует в моей базе данных? Все данные уже присутствуют в БД.

Мой базовый репозиторий использует этот код для сохранения сущностей:

abstract class AbstractRepository extends EntityRepository
{
    /**
     * @param $object
     * @throws \Doctrine\ORM\ORMException
     * @throws \Doctrine\ORM\OptimisticLockException
     */
    public function save($object)
    {
        $this->getEM()->persist($object);
        $this->getEM()->flush();
    }

Я использовал это базовое репо с февраля 2017 года для сохранения новых и обновленных объектов без каких-либо проблем, я действительно не могу понять это поведение

Доктрина хочет сохранить уже управляемую связанную сущностьДоктрина хочет сохранить уже управляемую связанную сущностьДоктрина хочет сохранить уже управляемую связанную сущностьДоктрина хочет сохранить уже управляемую связанную сущность

Снимок экземпляра объекта House, вы можете увидеть его пользователя, его группу пользователей и роли группы

Доктрина хочет сохранить уже управляемую связанную сущность

Можете ли вы посмотреть отсюда и сравнить расчеты и методы, которые у вас должны быть, и все должно работать -> stackoverflow.com/questions/49026436/relationships-in-doctri ne /…

l13 26.10.2018 21:48

не повезло ... если я помещу код в Fixture и использую ObjectManager, встроенный в Fixture, сущность будет сохранена. Не могу понять, в чем проблема. На прошлой неделе все работало до сих пор

Matt 31.10.2018 16:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
46
0

Другие вопросы по теме