Doctrine не сохраняется отношение - PullRequest
0 голосов
/ 03 августа 2020

У меня такое отношение:

В UserRole

    /**
     * @ORM\ManyToOne(targetEntity="Brand", inversedBy="managers")
     * @ORM\JoinColumn(referencedColumnName="id")
     */
    private $brandManage;

В бренде

    /**
     * @ORM\OneToMany(targetEntity="UserRole", mappedBy="brandManage")
     */
    private $managers;

в Пользователе

    /**
     * @ORM\OneToOne(targetEntity="UserRole", mappedBy="user", cascade={"persist"})
     */
    private $role;

Сейчас Я пытаюсь присвоить бренду brandManage в UserRole, но база данных не обновляется; отношение всегда равно NULL, даже если объект правильно обновлен перед сохранением (проверено с помощью дампа)

Для решения вопроса я использовал три метода сохранения, как вы можете видеть ниже; ни один из них не работает! Я также вставил die; после с теми же результатами

$userRole->setBrandManage($brand);
$userRoleRepository->save($userRole);

$user->setRole($userRole);
$userRepository->save($user);

$this->em->persist($userRole);
$this->em->persist($user);
$this->em->flush();

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

Итак, я пытался всегда создавать новый, но по какой-то причине doctrine не сохраняет новый UserRole, потому что он говорит, что UserRole с тем же идентификатором пользователя уже существует в базе данных, но это НЕ . Мне нужно сохранить второй раз для создания нового UserRole ...

EDIT: Если я сделаю следующую последовательность, она сработает, но не имеет смысла делать это так сложно .... Почему не могу я просто сохранить роль? Этот обходной путь эффективно создает новый UserRole, удаляя его перед повторным сохранением ... Итак, вернемся к исходной проблеме

$userRole->setBrandManage($brand);
$userRoleRepository->save($userRole);
                    
$user->setRole($userRole);
$userRepository->save($user);

$this->em->remove($user->getRole());
$this->em->flush();

$this->em->persist($userRole);
$this->em->persist($user);
$this->em->flush();

1 Ответ

0 голосов
/ 03 августа 2020

Функция сохранения уже сохраняется в базе данных. Вы можете выбрать между функцией sava или функцией сохранения.

$userRole->setBrandManage($brand);
$user->setRole($userRole);
// Note if you set cascade persist from user to role, you can omit that line
$this->em->persist($userRole); 
$this->em->persist($user);
$this->em->flush();
...