保存一个关系实体 [英] Saving onetoone relation entities
问题描述
完整性约束违规: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屋!