У меня проблема с обновлением двусторонней связи «один к одному».
Пользовательский объект
/**
*
* @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 это значение Идентификатор пользователя колонка в точки Таблица
Как я могу отредактировать существующую запись без ошибки о дублировании идентификатора?
Это старый, но так как я столкнулся с подобной проблемой, я решил ее следующим образом:
в пользователя
public function setPoints($points)
{
if ($this->points !== null) {
$this->points->setUser(null);
}
$this->points = $points;
$points->setUser($this);
}
Других решений пока нет …