首先,我不确定这是奏鸣曲问题还是 Symfony2 问题,这是我第一次使用 Sf2 表单来编辑关系。
这是问题所在:
我有两个类,我们称它们为旧的最爱:Car
和Wheel
. Car 与 Wheel 具有可选的一对一关系(仅作为示例,随它去吧……)。我已经使用嵌入使用的CarAdmin
类设置了 SonataAdmin,并尝试在不为 Wheel 输入任何数据的情况下创建 Car。WheelAdmin
sonata_type_admin
但是,在提交时(据我所知,在 $form->bind()/$form->submit() 中的某个位置)Symfony 和/或 Sonata 正在实例化一个 Wheel 并尝试将其持久化(其所有值为null
) . 由于 Wheel 有一些非空约束,这会引发 DBALException,抱怨您不能插入带有空值的 Wheel。
这很顽皮,我想阻止它发生。如果我不输入 Wheel 的任何详细信息,我不希望幻像 Wheel 威胁我的代码和数据库。我期望的是,如果我没有输入任何数据,就没有任何东西可以插入/保留,所以它就不用管了。但这不是正在发生的事情......任何想法如何将其驯服为明智的事情?
这是长版本,包含代码块和所有内容:
首先是 ORM 定义:
# MyNS\MyBundle\Resources\Config\Doctrine\Car.orm.yml
MyNS\MyBundle\Entity\Car:
type: entity
repositoryClass: MyNS\MyBundle\Entity\Repositories\CarRepository
table: test_cars
id:
id:
type: integer
generator: { strategy: AUTO }
fields:
color:
type: string
length: 50
owner:
type: string
length: 50
nullable: true
oneToOne:
leftFrontWheel:
targetEntity: Wheel
cascade: [ persist ]
joinColumn:
name: leftFrontWheelId
referencedColumnName: id
# MyNS\MyBundle\Resources\Config\Doctrine\Wheel.orm.yml
MyNS\MyBundle\Entity\Wheel:
type: entity
repositoryClass: MyNS\MyBundle\Entity\Repositories\WheelRepository
table: test_wheels
id:
id:
type: integer
generator: { strategy: AUTO }
fields:
diameter:
type: integer
length: 5
然后是 SonataAdmin 类:
namespace MyNS\MyBundle\Admin
use ...
class CarAdmin extends Admin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('color', null, array('required' => true))
->add('owner', null, array('required' => false))
->add('leftFrontWheel', 'sonata_type_admin', array('delete' => false))
;
}
protected function configureListFields(ListMapper $listMapper) { ... }
}
和
namespace MyNS\MyBundle\Admin;
use ...
class WheelAdmin extends Admin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('diameter', null, array('required' => false))
;
}
protected function configureListFields(ListMapper $listMapper) { ... }
}
最后是 admin.yml 条目:
services:
sonata.admin.car:
class: MyNS\MyBundle\Admin\CarAdmin
tags:
- { name: sonata.admin, manager_type: orm, label: "Car" }
arguments:
- ~
- MyNS\MyBundle\Entity\Car
- 'SonataAdminBundle:CRUD'
calls:
- [ setTranslationDomain, [MyNS\MyBundle]]
sonata.admin.wheel:
class: MyNS\MyBundle\Admin\WheelAdmin
tags:
- { name: sonata.admin, manager_type: orm, label: "Wheel" }
arguments:
- ~
- MyNS\MyBundle\Entity\Wheel
- 'SonataAdminBundle:CRUD'
calls:
- [ setTranslationDomain, [MyNS\MyBundle]]
预期/要求的行为:
显示一个包含三个字段的表单:
- 汽车.颜色(必填)
- 车主(可选)
- car.wheel.diameter(可选)
如果 car.wheel.diameter 留空,则不应创建 Wheel 并
test_cars.leftFrontWheelId
应保留null
在数据库中如果输入了 car.wheel.diameter,则应创建一个 Wheel 并将其链接到 Car(这似乎与现有配置一起工作)
问题:我如何让这个系统像上面那样运行?