我有与实体关联的产品实体与一对一的关系。所有产品都是导入的,产品在设置表中没有相关的行。
使用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创建我的音乐。
答案 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(),
));
}
我建议您查看: