在教义中使用一对一的单向关系



我有一个名为 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

相关内容

  • 没有找到相关文章

最新更新