我正在尝试使用教义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”不能为空

就像我说的那样,我在这里挖了谷歌,尝试在注解中移动内容。据我所知。不知道我在做什么错。有人可以帮忙吗?

最佳答案

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

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/

10-13 02:29