Doctrine One To One Однонаправленная ошибка сохранения ребенка - PullRequest
2 голосов
/ 17 октября 2019

Я работаю в Doctrine 2.6. Я не использую Symfony, просто работаю на своей собственной платформе. Я искал везде в сети и здесь в стеке, и каждое решение, которое я нашел, заканчивается одной и той же ошибкой.

Пожалуйста, помогите

Сущность пользователя

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\UniqueConstraint;

/**
 * @ORM\Entity
 * @ORM\Table(name="user",uniqueConstraints={@UniqueConstraint(name="user_idx", columns={"email"})})
 */
class User
{

/**
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 * @ORM\Column(type="integer")
 * @var int
 */
protected $id;

/**
 * @ORM\Column(type="string")
 * @var string
 */
protected $email;

 /**
 * @ORM\OneToOne(targetEntity="UserProfile", mappedBy="user")
 */
protected $profile;

Сущность профиля

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\JoinColumn;

/**
 * @ORM\Entity
 * @ORM\Table(name="user_profile")
 */
class UserProfile
{

    /**
     * @var integer
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var User
     * @ORM\OneToOne(targetEntity="User",inversedBy="profile")
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

Использование в контроллере

    $this->user = $this->entityManager->getRepository('User')->findOneBy(['email' => $login])


    $profile = new \UserProfile();
    $profile
        ->setUser($this->user)
        ->setAccountType(1);

    $this->entityManager->persist($profile);
    $this->entityManager->flush();

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

(!) Неустранимая ошибка: Uncaught Doctrine \ ORM \ ORMInvalidArgumentException: новая сущность была найдена через отношение 'UserProfile # user', который не был настроен для каскадного сохранения операций для объекта: User @ 0000000045b82749000000006e7c58e6. Чтобы решить эту проблему: либо явно вызовите EntityManager # persist () для этого неизвестного объекта, либо настройте каскадное сохранение этой ассоциации в сопоставлении, например @ManyToOne (.., cascade = {"persist"}). Если вы не можете выяснить, какая сущность вызывает проблему, реализуйте 'User #__ toString ()', чтобы получить подсказку. в D: \ wamp64 \ coresys \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ ORMInvalidArgumentException.php в строке 102

(!) Doctrine \ ORM \ ORMInvalidArgumentException: новый объект был найден через отношение 'UserProfile # user ', который не был настроен для каскадного сохранения операций для объекта: User @ 0000000045b82749000000006e7c58e6. Чтобы решить эту проблему: либо явно вызовите EntityManager # persist () для этого неизвестного объекта, либо настройте каскадное сохранение этой ассоциации в сопоставлении, например @ManyToOne (.., cascade = {"persist"}). Если вы не можете выяснить, какая сущность вызывает проблему, реализуйте 'User #__ toString ()', чтобы получить подсказку. в D: \ wamp64 \ coresys \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ ORMInvalidArgumentException.php в строке 102

я попытался добавить cascade = {"persist"} для обеих сущностей иследующая ошибка является результатом

(!) Неустранимая ошибка: Uncaught PDOException: SQLSTATE [23000]: Нарушение ограничения целостности: 1062 Повторяющаяся запись 'sales@mk2solutions.com' для ключа 'user_idx' в D: \ wamp64 \ coresys \ vendor \ doctrine \ dbal \ lib \ Doctrine \ DBAL \ Driver \ AbstractMySQLDriver.php в строке 55 (!) Doctrine \ DBAL \ Exception \ UniqueConstraintViolationException: возникла исключительная ситуация при выполнении пользователя INSERT INTO (электронная почта, firstName, lastName, пароль, accessRole, status, selectedOn, loggedInOn) ЗНАЧЕНИЯ (?,?,?,?,?,?,?,?) 'с параметрами ["sales@mk2solutions.com", "Matthew", "Chitty", {}, "ROLE_ADMIN", null, null, null]: SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись 'sales@mk2solutions.com' для ключа 'user_idx' в D: \ wamp64 \ coresys \ vendor \ doctrine\ DBAL \ Lib \ Doctrine \ DBAL\ Driver \ AbstractMySQLDriver.php в строке 55

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

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

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

Все готово и работает.

0 голосов
/ 03 ноября 2019

Измените метод UserProfile :: setUser следующим образом:

public function setUser($user) {
  $user->setProfile($this);
  $this->user = $user;
  return $this;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...