当我尝试保存我的订单实体时,我遇到了错误:
完整性约束违规:1048列'package_id'不能为空。
简化实体:
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;
}
}
重点是两个实体都是新的。所以他们还没有id。有没有选择,用
保存它们$em->persist( $order );
$em->flush();
答案 0 :(得分:3)
一旦已建立关系,您需要保留它们。尝试将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时遇到了这个问题。
答案 1 :(得分:1)
解决方案部分基于之前的答案,但仍然不足以完全解决问题。
所以有2个动作要做。 首先 - 添加
$package->setOrder($this);
到我的二传手。
第二 - 您不能将两个引用列都严格定义为NULL。所以,我已经将package_id coulmn重新定义为null,并且它已经成功了。