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