保存一个关系实体 [英] Saving onetoone relation entities

查看:115
本文介绍了保存一个关系实体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



完整性约束违规:1048列'package_id'不能为空。

我正在收到folowwing错误,当我尝试保存我的订单实体时>

简化实体:

 类订单
{

/ **
* @ ORM\Id
* @ ORM\Column(type =integer)
* @ ORM\GeneratedValue(strategy =IDENTITY )
* /
protected $ id;

/ **
* @ ORM\OneToOne(targetEntity =DeliveryPackage,inversedBy =order,cascade = {persist})
* @ ORM\\ \\ JoinColumn(name =package_id,referencedColumnName =id)
* /
protected $ package;

/ **
* @ ORM\ManyToOne(targetEntity =User,cascade = {persist})
* @ ORM\JoinColumn(name = user_id,referencedColumnName =id)
* /
protected $ user;

public function setId($ id)
{
$ this-> id = $ id;
}

public function getId()
{
return $ this-> id;
}

public function setPackage($ package)
{
$ this-> package = $ package;
}

public function getPackage()
{
return $ this-> package;
}
}

class DeliveryPackage
{
/ **
* @ ORM\Id
* @ ORM\\ \\ Column(type =integer)
* @ ORM\GeneratedValue(strategy =IDENTITY)
* /
protected $ id;

/ **
* @ ORM\OneToOne(targetEntity =Order,mappedBy =deliverypackage,cascade = {persist})
* @ ORM\\ \\ JoinColumn(name =order_id,referencedColumnName =id)
* /
protected $ order;

public function setId($ id)
{
$ this-> id = $ id;
}

public function getId()
{
return $ this-> id;
}

public function setOrder($ order)
{
$ this-> order = $ order;
}

public function getOrder()
{
return $ this-> order;
}

}

主要的是,的实体是新的。所以他们还没有id。有没有任何选择,以保存它们与

  $ em-> persist($ order); 
$ em-> flush();

解决方案

一旦关系已经建立,你就需要坚持下去。尝试将Order :: setPackage更改为以下内容:

  public function setPackage($ package)
{
$ this-> package = $ package;
$ package-> setOrder($ this);
}

然后在坚持之前建立关系:

  $ order = new Order(); 
$ package = new Package();
$ order-> setPackage($ package);
$ em-> persist($ order);
$ em-> flush();

我想你会发现它可以正常工作。第一次玩Doctrine 2时遇到这个确切的问题。


I'm getting folowwing error, when i try to save my Order Entity:

Integrity constraint violation: 1048 Column 'package_id' cannot be null.

Simplified Entities:

    class Order
    {

        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        protected $id;        

        /** 
         * @ORM\OneToOne(targetEntity="DeliveryPackage",inversedBy="order", cascade={"persist"})  
         * @ORM\JoinColumn  (name="package_id", referencedColumnName="id")   
         */
        protected $package; 

        /**
         * @ORM\ManyToOne(targetEntity="User",cascade={"persist"} )
         * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
         */
        protected $user;

    public function setId($id)
    {
        $this->id = $id;
    }

    public function getId()
    {
        return $this->id;
    }

    public function setPackage($package)
    {
        $this->package = $package;
    }

    public function getPackage()
    {
        return $this->package;
    }
}

class DeliveryPackage
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /** 
     * @ORM\OneToOne(targetEntity="Order",mappedBy="deliverypackage",cascade={"persist"})
     * @ORM\JoinColumn  (name="order_id", referencedColumnName="id")       
     */
    protected $order;    

    public function setId( $id )
    {
        $this->id = $id;
    }

    public function getId()
    {
        return $this->id;
    }

    public function setOrder( $order )
    {
        $this->order = $order;
    }

    public function getOrder()
    {
        return $this->order;
    }   

}

The main point, is that both of entities are new. So they dont have id's yet. Is there any option, to save both of them with

$em->persist( $order );
$em->flush();

?

解决方案

You need to persist them once the relation is already established. Try changing Order::setPackage to the following:

public function setPackage($package)
{
    $this->package = $package;
    $package->setOrder($this);
}

Then establish a relation BEFORE persisting:

$order = new Order();
$package = new Package();
$order->setPackage($package);
$em->persist($order);
$em->flush();

The I think you'll find it then works OK. I ran into this exact issue when first playing with Doctrine 2.

这篇关于保存一个关系实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆