Доктрину хотят сохранить уже управляемой ассоциированной сущностью - PullRequest
0 голосов
/ 26 октября 2018

Привет, у меня есть такая настройка: House N-1 User N-1 Group NN Role

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);

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

Новый объект был обнаружен в связи «Пользователь # группа», который не был настроен для каскадных операций сохранения для объекта

Итак, я отредактировал свои отображения так, чтобы у них была опция cascade = ["persist"] :

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, я получил эту ошибку

Возникла исключительная ситуация при выполнении 'INSERT INTO role (code, description) VALUES (?,?)' с параметрами ['ROLE_USER', null]: SQLSTATE [23000]: Нарушение ограничения целостности: 1062 Повторяющаяся запись 'ROLE_USER' для ключа 'UNIQ_B63E2EC777153098'

Исключительная ситуация при выполнении жанров INSERT INTO (имя, активный, parent_id) ЗНАЧЕНИЯ (?,?,?) 'с параметрами [ноль, 1, ноль]: SQLSTATE [23000]: Нарушение ограничения целостности: 1048 Имя столбца не может быть пустым

Почему кажется, что 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 года для сохранения новых иобновленные сущности без проблем вообще, я действительно не могу понять это поведение

enter image description here enter image description here enter image description here enter image description here

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...