Доктрина 2: Как обновить двунаправленную связь один-к-одному

У меня проблема с обновлением двусторонней связи «один к одному».

Пользовательский объект

/**
*
* @ORM\Table(name="test_user")
*/
class User
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;

/**
* @var string
*
* @ORM\Column(name="login", type="string", length=32, nullable=false, unique=true)
*/
private $login;


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

...


/**
* Set points
*/
public function setPoints(array $points)
{
$this->points = new Points($points);
$this->points->setUser($this);

return $this;
}

/**
* Get points
*/
public function getPoints()
{
return $this->points;
}

}

Точки Entity

/**
* Points
*
* @ORM\Table(name="test_user_points")
* @ORM\Entity
*/
class Points {

/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;

/**
* @var integer
*
* @ORM\Column(type="integer",  nullable=false)
*/
private $points;


/**
* @var string
*
* @ORM\Column(name="period", type="string", length=24)
*/
private $period;


/**
* @var User
*
* @ORM\OneToOne(targetEntity="User", inversedBy="points")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id",onDelete="CASCADE", nullable=false)
*/
private $user;





/**
* Constructor
*/
public function __construct(array $params = array())
{
$hydrator = new MyHydrator();
$hydrator->hydrate($params, $this);
}


...

/**
* Set user
*
* @param User $user
*/
public function setUser(User $user = null)
{
$this->user = $user;

return $this;
}

/**
* Get user
*
* @return User
*/
public function getUser()
{
return $this->user;
}


}

Учебный класс MyHydrator преобразует из массива (первый параметр) в объект (второй параметр). Это очень важно, и я должен использовать это.

Моя функция сохранения выглядит так:

public function save(array $data)
{
...

// This is how my input data looks

$data = array(
'login' => 'Test',
array(
'points' => 999,
'period' => 'monthly'
)
);

if ($userExists) {
// UPDATE
$hydrator = new MyHydrator();
$hydrator->hydrate($data, $userExists);
$this->em->persist($userExists);
$this->em->flush();

} else {
// INSERT
$user = new User($data);
$this->em->persist($user);
$this->em->flush();
}
}

Вставка в базу данных работает отлично, но когда я пытаюсь обновить запись, я получаю сообщение об ошибке:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '4' for key 'UNIQ_DAD93D6EA76ED395'

4 это значение Идентификатор пользователя колонка в точки Таблица

Как я могу отредактировать существующую запись без ошибки о дублировании идентификатора?

1

Решение

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

public function setPoints($points)
{
if ($this->points !== null) {
$this->points->setUser(null);
}
$this->points = $points;
$points->setUser($this);
}
0

Другие решения

Других решений пока нет …