我有一个名为 Install 的实体,它有两个属性:主机名和服务呼叫号码。 服务呼叫号码是可选的。 我不允许该字段为空并违反 1NF,而是创建了第二个名为 ServiceCall 的实体,该实体与安装实体具有一对一的单向关系。 我的问题是,当我在表单中同时输入主机名和服务调用并提交时,仅保留主机名,而不是服务调用和关系。 这是我的代码:
服务调用实体
class ServiceCall
{
/**
* @var integer
*/
private $id;
/**
* @var integer
*/
private $serviceCall;
private $install;
// Getters / Setters
}
安装实体
class Install
{
/**
* @var integer
*/
private $id;
/**
* @var string
*/
private $hostname;
private $serviceCall;
// Getters / Setters
}
关系配置:
AppBundleEntityInstall:
type: entity
table: null
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
hostname:
type: string
length: 255
lifecycleCallbacks: { }
AppBundleEntityServiceCall:
type: entity
table: null
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
serviceCall:
type: integer
lifecycleCallbacks: { }
oneToOne:
install:
targetEntity: AppBundleEntityInstall
joinColumn:
name: install_id
referencedColumnName: id
控制器方法:
public function createAction(Request $request)
{
$entity = new Install();
$form = $this->createCreateForm($entity);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('install_show', array('id' => $entity->getId())));
}
return $this->render('AppBundle:Install:new.html.twig', array(
'entity' => $entity,
'form' => $form->createView(),
));
}
安装表单类型
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('hostname')
->add('serviceCall', new ServiceCallType())
;
}
服务呼叫表单类型
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('serviceCall')
;
}
必须为安装条目添加一对一关系,而不是为服务调用实体添加一对一关系。
并且不要忘记为关系添加级联持久选项。
并且还需要为关系创建新的服务呼叫实体。
为此,请在ServiceCallFormType中使用DataTransformer