我正在尝试使用 Doctrine ORM 关联。我已经阅读了几个教程和在线文档,但它不起作用,老实说我不确定我在这里做错了什么。似乎我对 Doctrine 的实验很成功或失败。如有任何帮助,我们将不胜感激。
我想要一个 User 实体和 UserHistory 实体,其中包含单个用户的多行。这对我来说听起来像是一对多。我不一定需要它是双向的。
我遇到的问题是,在保存用户时向用户添加历史记录项会导致错误,因为 user_history 表中未设置 user_id 列。
实体:
# 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;
}
}
在我的 Controller 中,我正在尝试这样做:
$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
留言:
使用参数 [null] 执行 'INSERT INTO user_history (user_id) VALUES (?)' 时发生异常:
SQLSTATE[23000]:违反完整性约束:1048 列“user_id”不能为空
就像我说的,我已经在 SO 上四处搜索,用谷歌搜索,尝试在注释中移动内容。据我所知。不知道我做错了什么。谁能帮忙?
最佳答案
问题是您没有在历史类中设置用户实体。关联的东西不会自动执行此操作。
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);
关于php - 原则一对多关系不会保存 - 违反完整性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22123521/