【问题标题】:Doctrine One-To-Many Relationship Won't Save - Integrity Constraint Violation原则一对多关系不会保存 - 违反完整性约束
【发布时间】:2014-03-02 03:38:17
【问题描述】:

我正在尝试使用 Doctrine ORM 关联。我已经阅读了几个教程和在线文档,但它不起作用,老实说,我不确定我在这里做错了什么。似乎我对 Doctrine 的实验很成功或失败。任何帮助将不胜感激。

我想要一个 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

消息:

使用参数 [null] 执行“INSERT INTO user_history (user_id) VALUES (?)”时发生异常:

SQLSTATE[23000]:违反完整性约束:1048 列 'user_id' 不能为空

就像我说的那样,我已经在 SO 上挖掘了这里,用谷歌搜索,尝试在注释中移动东西。这是据我所知。不知道我做错了什么。有人可以帮忙吗?

【问题讨论】:

  • 不清楚用户历史记录实际上保留了哪些历史记录;如果您打算在任何给定时间保存用户的状态,那么您的方法将不起作用,因为它将始终引用最新的用户记录。
  • 对不起 - 我从示例中的两个实体中删除了所有字段以保持干净。 UserHistory 将存储审计跟踪内容,例如:“用户 X 在 DateTime 上做了 Y”。 '添加了一些内容' '收藏了一些东西' '修改了一些东西。'

标签: php doctrine-orm zend-framework2


【解决方案1】:

问题是您没有在历史记录类中设置用户实体。关联的东西不会自动执行此操作。

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);

【讨论】:

  • 嘘!做到了。谢谢:-)
  • 欢迎。把我推过 10K 代表的障碍。
猜你喜欢
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 2012-04-17
  • 2016-08-12
相关资源
最近更新 更多