gpt4 book ai didi

php - symfony3 : create form for entity that has a column with many to one relationship

转载 作者:可可西里 更新时间:2023-11-01 12:36:08 25 4
gpt4 key购买 nike

我有一个“任务”表,它引用了一个“Estados”表,该表具有从列 Tasks.taskestado 到 Estados.estado 的外键。

这是任务的相关 XML 映射:

<entity name="AppBundle\Entity\Tasks" table="TASKS" repository-class="AppBundle\Repository\TasksRepository">
<id name="taskid" type="bigint" column="TaskID">
<generator strategy="IDENTITY"/>
</id>
...
<many-to-one field="taskestado" target-entity="Estados" fetch="LAZY">
<join-columns>
<join-column name="TaskEstado" referenced-column-name="Estado"/>
</join-columns>
</many-to-one>
...

对于 Estados:

<entity name="AppBundle\Entity\Estados" table="ESTADOS">
<id name="estado" type="string" column="Estado" length="15">
<generator strategy="IDENTITY"/>
</id>
<field name="estadodescricao" type="string" column="EstadoDescricao" length="50" nullable="true">
<options>
<option name="fixed"/>
</options>
</field>
...

鉴于此,我正在尝试执行一个操作 (novaAction()) 来创建任务。这是 Controller 代码:

public function novaAction(Request $request)
{
$task = new Tasks();
$em = $this->getDoctrine()->getManager();

dump($task);
#$task->setTaskEstado(new Estados());
$form = $this->createForm(TasksType::class, $task);
$form->handleRequest($request);

if ($form->isSubmitted()) {
if ($form->isValid()) {
// Criar a tarefa na BD
$em->persist($form->getData());
$em->flush();
$this->addFlash('notice', 'app.nova_tarefa.mensagem_sucesso');

return $this->redirectToRoute('nova_tarefa');
}

$this->addFlash('error', 'app.nova_tarefa.mensagem_erro');
}

以及相关的TasksType代码:

class TasksType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('taskid', HiddenType::class)
...
#->add('taskestado')
->add('taskestado', EntityType::class, [ 'class' => 'AppBundle:Estados' ])
...
}

/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Tasks',
#'empty_data' => function (\Symfony\Component\Form\FormInterface $form) {
# #return new Tasks($form->get('tasks')->getData());
# return new Tasks();
#},
));
}
}

“empty_data”选项试图在不向其传递任务实例的情况下创建表单。此外,当我使用注释代码添加 taskestado 时,我得到了相同的结果,我。即,没有参数。

这是相关的任务实体:

namespace AppBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;

/**
* Tasks
*/
class Tasks
{
/**
* @var integer
*/
protected $taskid;

/**
* @var \AppBundle\Entity\Estados
*/
protected $taskestado;

...

/**
* Get taskid
*
* @return integer
*/
public function getTaskid()
{
return $this->taskid;
}

/**
* Set taskestado
*
* @param \AppBundle\Entity\Estados $taskestado
*
* @return Tasks
*/
public function setTaskestado(\AppBundle\Entity\Estados $taskestado = null)
{
$this->taskestado = $taskestado;

return $this;
}

/**
* Get taskestado
*
* @return \AppBundle\Entity\Estados
*/
public function getTaskestado()
{
return $this->taskestado;
}

...
}

当我打开页面时,出现以下错误:

Entities passed to the choice field must be managed. Maybe persist them in the entity manager?

我还生成了 CRUD (bin/console doctrine:generate:crud --filter=Tasks),这样我就可以检查它是如何完成的,但代码也很相似作为结果(在修复了某些日期时间列的 TasksType 中的一些问题之后)。

我做错了什么?

最佳答案

如错误所述,您需要在任务映射中设置 cascade = persist。例如:

<many-to-one field="taskestado" target-entity="Estados" fetch="LAZY">
<cascade>
<cascade-persist/>
</cascade>
<join-columns>
<join-column name="TaskEstado" referenced-column-name="Estado"/>
</join-columns>
</many-to-one>

也不是做 $em->persist($form->getData());使用 $em->persist($task);

看看是否可行...

关于php - symfony3 : create form for entity that has a column with many to one relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34686279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com