在 Doctrine 中处理一对一的单向关系

Working with One-to-One unidirectional relationship in Doctrine

我有一个名为 Install 的实体,它具有两个属性:主机名和服务呼叫号码。服务电话号码是可选的。我没有允许该字段为空并违反 1NF,而是创建了第二个名为 ServiceCall 的实体,它与 Install 实体具有一对一的单向关系。我的问题是,当我在表单中输入主机名和服务调用并提交时,只会保留主机名,而不是服务调用和关系。这是我的代码:

服务调用实体

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
}

关系配置:

AppBundle\Entity\Install:
type: entity
table: null
id:
    id:
        type: integer
        id: true
        generator:
            strategy: AUTO
fields:
    hostname:
        type: string
        length: 255
lifecycleCallbacks: {  }

AppBundle\Entity\ServiceCall:
type: entity
table: null
id:
    id:
        type: integer
        id: true
        generator:
            strategy: AUTO
fields:
    serviceCall:
        type: integer
lifecycleCallbacks: {  }
oneToOne:
    install:
        targetEntity: AppBundle\Entity\Install
        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())
    ;
}

ServiceCall 表单类型

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('serviceCall')
    ;
}

您必须为 Install 条目添加 OneToOne 关系,而不是为 ServiceCall 实体。

并且没有忘记为关系添加级联持久化选项。

并且还需要为关系创建新的 ServiceCall 实体。

为此使用 ServiceCallFormType 中的 DataTransformer