Symfony2 OneToOne注释插入/更新相关实体

时间:2014-03-04 07:59:26

标签: php symfony doctrine-orm entity one-to-one

我有与实体关联的产品实体与一对一的关系。所有产品都是导入的,产品在设置表中没有相关的行。

使用Symfony更新产品时,会创建正确的关系,因此我在产品和设置之间有OneToOne。这是使用简单的INSERT语句完成的:

INSERT INTO settings (id_product, setting_1, setting_3, setting_3) VALUES (11153, '0', '1', '1');

这个插入由Symfony自动制作,这要归功于注释和方法:

$em->merge($product);
$em->flush();

不幸的是,当我下次尝试更新产品时,另一个插入设置表已完成,显然我有错误因为id_product是PK并且必须是唯一的。如果产品和设置之间存在关联,我应该怎么做才能强制Symfony进行UPDATE而不是INSERT?我使用最新版本的Symfony创建我的音乐。

1 个答案:

答案 0 :(得分:1)

更新的方式与创建实体的方式不同。这是一个非常快速的例子(你必须处理一些例外等...但是代码是'短'来向你展示差异:

1 创建任务时,创建一个新实体Task并将其保存到数据库

2 更新任务时,首先从数据库中获取该任务,然后将其保存到数据库中。

创建

public function newAction(Request $request)
    {
        // create a task and give it some dummy data for this example
        $task = new Task();
        $task->setTask('Write a blog post');
        $task->setDueDate(new \DateTime('tomorrow'));

        $form = $this->createFormBuilder($task)
            ->add('task', 'text')
            ->add('dueDate', 'date')
            ->add('save', 'submit')
            ->getForm();

        if ($request->isMethod('POST')) {
            $form->bind($request);

            if ($form->isValid()) {

                // perform some action, such as saving the task to the database
                $em = $this->getDoctrine()->getManager();
                $em->persist($task);
                $em->flush();

                return $this->redirect($this->generateUrl('task_success'));
             }  
        } 

        return $this->render('AcmeTaskBundle:Default:new.html.twig', array(
            'form' => $form->createView(),
        ));
    }

更新:

public function updateAction(Request $request, $taskId)
    {
        // get the task
        $task = $this->getDoctrine()
            ->getRepository('AcmeTaskBundle:Task');
            ->find($taskId);

        $form = $this->createFormBuilder($task)
            ->add('task', 'text')
            ->add('dueDate', 'date')
            ->add('save', 'submit')
            ->getForm();

        if ($request->isMethod('POST')) {
            $form->bind($request);

            if ($form->isValid()) {

                // update the task
                $em->flush();

                return $this->redirect($this->generateUrl('task_success'));
             }  
        } 

        return $this->render('AcmeTaskBundle:Default:new.html.twig', array(
            'form' => $form->createView(),
        ));
    }

我建议您查看: