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

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






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