symfony3:为具有多对一关系的列的实体创建表单

努诺·佩雷拉(Nuno Pereira)

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

这是与Tasks相关的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())来创建任务。这是控制器代码:

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”选项是尝试创建表单而不将Tasks实例传递给它的尝试。另外,当我添加带有注释代码的taskestado(即不带参数)时,我得到相同的结果。

这是相关的Tasks实体:

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;
    }

    ...
}

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

传递给选择字段的实体必须进行管理。也许将它们保留在实体经理中?

我还生成了CRUD(bin/console doctrine:generate:crud --filter=Tasks),以便可以检查它的完成方式,但是代码和结果相似(在一些日期时间列的TasksType中修复了一些问题之后)。

我究竟做错了什么?

努诺·佩雷拉(Nuno Pereira)

我终于得到了答案,这远非显而易见。

正如我在问题中所说的,Tasks.taskestado与Estados.estado之间存在多对一的关系。Estados.estado是一个字符串,可以为空,可以是空字符串,也可以是(通常)非空字符串。尽管未在映射中指出,但空字符串是taskestado的默认值。

我已经在表格上了,并且Estados.estado的条目之一就是空字符串。

我没有在问题中发帖,但在此异常的堆栈跟踪中看到了以下信息:

[1] Symfony\Component\Form\Exception\RuntimeException: Entities passed to the choice field must be managed. Maybe persist them in the entity manager?
    at n/a
        in /var/www/simpletask2/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Form/ChoiceList/IdReader.php line 119

    at Symfony\Bridge\Doctrine\Form\ChoiceList\IdReader->getIdValue(object(Estados))
        in  line 

    at call_user_func(array(object(IdReader), 'getIdValue'), object(Estados))
        in /var/www/simpletask2/vendor/symfony/symfony/src/Symfony/Component/Form/ChoiceList/ArrayChoiceList.php line 204

    at Symfony\Component\Form\ChoiceList\ArrayChoiceList->flatten(array(object(Estados), object(Estados), object(Estados), object(Estados), object(Estados), object(Estados), object(Estados), object(Estados)), array(object(IdReader), 'getIdValue'), array(), array(), array())
        in /var/www/simpletask2/vendor/symfony/symfony/src/Symfony/Component/Form/ChoiceList/ArrayChoiceList.php line 91

因此,EntityType从数据库中检索了值,并试图呈现它们。换句话说,它们已经存在并且问题不能真正存在于我初始化实体的方式中。

因此,我想起了Estados实体的空字符串值,并试图将其从数据库中删除:问题解决了,TaskEstado实体已初始化并按预期方式呈现。

现在,我需要一种解决方法,但是找到了解决方案。

感谢大家的回答。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Symfony主义查询生成器查找具有多对一关系的实体

来自分类Dev

当表单具有实体类型时,Symfony3多对多现实

来自分类Dev

Zend2-Doctrine2:创建具有多对一关系的新实体

来自分类Dev

在Postgresql中创建具有多对一关系的表

来自分类Dev

为具有多对一关系的列保存对象时出错

来自分类Dev

为具有多对一关系的列保存对象时出错

来自分类Dev

具有两个多对一关系的实体关系

来自分类Dev

EF代码优先:具有多个多对一关系的实体类型

来自分类Dev

如何使用休眠Lucene搜索具有多对一关系的实体

来自分类Dev

EF代码优先:具有多个多对一关系的实体类型

来自分类Dev

在多对一关系的多方创建实体的实例

来自分类Dev

JPA persit在多对一关系中创建新的现有实体

来自分类Dev

3个实体之间的多对一关系

来自分类Dev

Symfony3 表单类型和多对多关系

来自分类Dev

使用 Symfony 3 访问多对一关系的用户分数

来自分类Dev

Django,与抽象实体多对一关系

来自分类Dev

使用Thymeleaf发布具有多对一关系的数据

来自分类Dev

如何正确连接具有多对一关系的表

来自分类Dev

Symfony 多对一关系 SQL 错误

来自分类Dev

实体框架6:具有继承关系的一对一关系

来自分类Dev

Symfony2实体:用户与帖子之间的多对一关系

来自分类Dev

为多对一关系生成模式

来自分类Dev

Symfony 2-具有一对多奏鸣曲媒体关系的克隆实体

来自分类Dev

Hibernate TransientPropertyValueException,同时保留实体ID为0的多对一关系

来自分类Dev

同一实体的多对多集合,具有双向关系

来自分类Dev

需要使用awk在具有多对一关系的两列的基础上过滤数据

来自分类Dev

具有一对多/多对一关系的POJO数据(JDBC)

来自分类Dev

具有一对多/多对一关系的POJO数据(JDBC)

来自分类Dev

JPA:如何保存具有一对一关系的两个实体?

Related 相关文章

  1. 1

    Symfony主义查询生成器查找具有多对一关系的实体

  2. 2

    当表单具有实体类型时,Symfony3多对多现实

  3. 3

    Zend2-Doctrine2:创建具有多对一关系的新实体

  4. 4

    在Postgresql中创建具有多对一关系的表

  5. 5

    为具有多对一关系的列保存对象时出错

  6. 6

    为具有多对一关系的列保存对象时出错

  7. 7

    具有两个多对一关系的实体关系

  8. 8

    EF代码优先:具有多个多对一关系的实体类型

  9. 9

    如何使用休眠Lucene搜索具有多对一关系的实体

  10. 10

    EF代码优先:具有多个多对一关系的实体类型

  11. 11

    在多对一关系的多方创建实体的实例

  12. 12

    JPA persit在多对一关系中创建新的现有实体

  13. 13

    3个实体之间的多对一关系

  14. 14

    Symfony3 表单类型和多对多关系

  15. 15

    使用 Symfony 3 访问多对一关系的用户分数

  16. 16

    Django,与抽象实体多对一关系

  17. 17

    使用Thymeleaf发布具有多对一关系的数据

  18. 18

    如何正确连接具有多对一关系的表

  19. 19

    Symfony 多对一关系 SQL 错误

  20. 20

    实体框架6:具有继承关系的一对一关系

  21. 21

    Symfony2实体:用户与帖子之间的多对一关系

  22. 22

    为多对一关系生成模式

  23. 23

    Symfony 2-具有一对多奏鸣曲媒体关系的克隆实体

  24. 24

    Hibernate TransientPropertyValueException,同时保留实体ID为0的多对一关系

  25. 25

    同一实体的多对多集合,具有双向关系

  26. 26

    需要使用awk在具有多对一关系的两列的基础上过滤数据

  27. 27

    具有一对多/多对一关系的POJO数据(JDBC)

  28. 28

    具有一对多/多对一关系的POJO数据(JDBC)

  29. 29

    JPA:如何保存具有一对一关系的两个实体?

热门标签

归档