Php 坚持一对一强制关系问题的符号主义
我在尝试持久化具有强制一对一关系的实体时遇到了一些问题,我得到了一条消息:SQLSTATE[23000]:完整性约束冲突:1048列“deliveryMode\u id”不能为null 因此,我有一个商店实体:Php 坚持一对一强制关系问题的符号主义,php,sql,symfony,doctrine-orm,doctrine,Php,Sql,Symfony,Doctrine Orm,Doctrine,我在尝试持久化具有强制一对一关系的实体时遇到了一些问题,我得到了一条消息:SQLSTATE[23000]:完整性约束冲突:1048列“deliveryMode\u id”不能为null 因此,我有一个商店实体: class Shop{ ... /** * @ORM\OneToOne(targetEntity="acme\Bundle\DeliveryBundle\Entity\DeliveryMode", cascade={"all"}, orphanRemoval=
class Shop{
...
/**
* @ORM\OneToOne(targetEntity="acme\Bundle\DeliveryBundle\Entity\DeliveryMode", cascade={"all"}, orphanRemoval=true)
* @ORM\JoinColumn(nullable=false)
* @Assert\Valid
*/
private $deliveryMode;
...
}
我还有一个DeliveryMode实体,它与商店实体没有任何链接(这不是双向关系)
我有与Shop和DeliveryMode关联的工作表单类型(deliveryModeFormType嵌套在Shop中)
当我尝试(验证操作成功后)执行
我有上面提到的错误
我试图改变
nullable=false
到
nullable=true
而且,它可以很好地坚持正确的交付模式附加到商店,当然还有商店
所以我认为这证明了一切都是正确的,这是否是第2.4.4条的一个可能的缺陷?实际上,商店的SQL插入似乎是在deliveryMode插入之前完成的,因此SQL引发了一个异常,因为我们在商店deliveryMode上有一个不可为null的属性。
一旦不可为空的限制被删除,问题就消失了,奇怪的事情,谢谢你的帮助
编辑:当将数据库操作放入条令事务中时,这是完美的,我认为有一种优先级管理通过条令ORM失败,应该在商店前插入DeliveryMode,而不是这样的情况我没有看到任何错误。尝试在执行过程中的不同点转储
$deliveryMode
,并确保正确处理。例如,您可以在类型中为FormEvents::POST_set_DATA
等设置侦听器。顺便说一句,您可能希望尝试轻松转储。感谢FyodorX的帮助,Ladybug是一个很棒的工具!在执行以下操作时:瓢虫转储模具($shop->getDeliveryMode());就在刷新之前,一切正常,但是我仍然有我在发布Shop
的setDeliveryMode()
?当然:public function setDeliveryMode(DeliveryMode$DeliveryMode){$this->DeliveryMode=$DeliveryMode;返回$this;}
$entityManager->persist($new_shop);