Я пытаюсь использовать ассоциации Doctrine ORM. Я прочитал несколько учебников и онлайн-документов, но он не работает, и я честно не уверен, что я делаю неправильно здесь. Похоже, что мои эксперименты с Доктриной довольно ударил или промахнулся. Любая помощь будет оценена.
Я хотел бы иметь объект User и объект UserHistory, который имеет несколько строк для одного пользователя. Это для меня звучит как «Один-ко-многим». Мне не обязательно, чтобы он был двунаправленным.
Проблема, с которой я сталкиваюсь, заключается в добавлении элемента истории к пользователю, приводит к ошибке при сохранении пользователя, поскольку столбец user_id не установлен в таблице user_history.
Объекты:
# Entity\User.php <?php namespace Application\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Entity */ class User { /** * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") * @ORM\Column(type="integer") */ protected $id; /** * @ORM\Column(type="string",length=255) */ protected $username; /** * @ORM\OneToMany(targetEntity="UserHistory", mappedBy="user", cascade={"persist","remove"}) * @ORM\JoinColumn(name="id", referencedColumnName="user_id") */ protected $history; public function __construct() { $this->setHistory(new ArrayCollection()); } public function getHistory() { return $this->history; } } # Entity\UserHistory.php <?php namespace Application\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="user_history") */ class UserHistory { /** * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") * @ORM\Column(type="integer") */ protected $id; /** * @ORM\ManyToOne(targetEntity="User") * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false) */ protected $user; public function getUser() { return $this->user; } }
В моем контроллере я пытаюсь это сделать:
$em = $this->getUserService()->getEntityManager(); $user = $em->find('Picpara\Entity\User', 1); $history = new UserHistory(); $user->getHistory()->add($history); $em->persist($user); $em->flush();
Все это приводит к нарушению целостности.
Учение \ DBAL \ DBALException
Файл: /myproject/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php:91
Сообщение:
Исключение произошло при выполнении 'INSERT INTO user_history (user_id) VALUES (?)' С параметрами [null]:
SQLSTATE [23000]: нарушение ограничения целостности: 1048 Колонка user_id не может быть нулевой
Как я уже сказал, я вырыл здесь на SO, googled, пытался перемещать вещи в аннотациях. Это насколько я понимаю. Не уверен, что я делаю неправильно. Может ли кто-нибудь помочь?
Проблема в том, что вы не устанавливаете пользовательский объект в своем классе истории. Компонент ассоциации не делает это автоматически.
class UserHistory { public function setUser($user) { $this->user = $user; } class User { public function addHistory($history) { $this->history->add($history); $history->addUser($this); // *** This is what you are missing } // In your controller class $user->addHistory($history);
-class UserHistory { public function setUser($user) { $this->user = $user; } class User { public function addHistory($history) { $this->history->add($history); $history->addUser($this); // *** This is what you are missing } // In your controller class $user->addHistory($history);