Forms Gedmo条令扩展树无法创建没有父级的类别

Forms Gedmo条令扩展树无法创建没有父级的类别,forms,symfony,nested-sets,doctrine-extensions,Forms,Symfony,Nested Sets,Doctrine Extensions,我使用Gedmo条令扩展将类别作为嵌套集处理。 我正在构建一个RESTAPI,我有一个创建类别的路径。 我希望能够创建根类别或子类别。 这是实体 <?php namespace AppBundle\Entity; use Gedmo\Mapping\Annotation as Gedmo; use Doctrine\ORM\Mapping as ORM; /** * @Gedmo\Tree(type="nested") * @ORM\Table(name="bo_categorie

我使用Gedmo条令扩展将类别作为嵌套集处理。 我正在构建一个RESTAPI,我有一个创建类别的路径。 我希望能够创建根类别或子类别。 这是实体

<?php
namespace AppBundle\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;

/**
 * @Gedmo\Tree(type="nested")
 * @ORM\Table(name="bo_categories")
 * use repository for handy tree functions
 * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
 */
class Category
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue
     */
    private $id;

    /**
     * @ORM\Column(name="name", type="string", length=64)
     */
    private $name;

    /**
     * @Gedmo\TreeLeft
     * @ORM\Column(name="lft", type="integer")
     */
    private $lft;

    /**
     * @Gedmo\TreeLevel
     * @ORM\Column(name="lvl", type="integer")
     */
    private $lvl;

    /**
     * @Gedmo\TreeRight
     * @ORM\Column(name="rgt", type="integer")
     */
    private $rgt;

    /**
     * @Gedmo\TreeRoot
     * @ORM\Column(name="root", type="integer", nullable=true)
     */
    private $root;

    /**
     * @Gedmo\TreeParent
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $parent;

    /**
     * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
     * @ORM\OrderBy({"lft" = "ASC"})
     */
    private $children;

    public function getId()
    {
        return $this->id;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setParent(Category $parent = null)
    {
        $this->parent = $parent;
    }

    public function getParent()
    {
        return $this->parent;
    }
}
如果我想创建一个子类别,它可以正常工作。但是如果我想创建一个根类别而不删除表单中的父字段,我会得到这个错误

从bo_类别b0_.id中选择b0_.id作为id0,b0_.name作为name1,b0_.lft作为lft2,b0_.lvl作为lvl3,b0_.rgt作为rgt4,b0_.root作为root5,b0_.parent作为parent_id作为parent_id6时发生异常,其中b0_.id IN'带有参数[]:\n\nSQLSTATE[22P02]:无效文本表示:7错误:整数的输入语法无效:, 类别:条令\DBAL\DBALException


为什么会出现这个错误?表单中的父值不能为空/null吗?

父值为null绝对没有问题。另一方面,您当前的映射不允许这样做

首先,您应该修改$parent的映射

应允许空值:

不要忘记在更改映射时运行app/console原则:schema:update-force

接下来,您的表单看起来不错,但它缺少一个属性-empty_值。这不会强制您选择父类别

->add('parent', 'entity', array(
      'class'    => 'AppBundle:Category',
      'property' => 'id',
))
应该是这样的:

->add('parent', 'entity', array(
      'class'    => 'AppBundle:Category',
      'property' => 'id',
      'empty_value' => '-- Select parent --'
))
这将添加没有值的额外选项,并且在创建新类别时默认应选中该选项。由于您的字段是entity类型,因此当您需要选择parent时,您也将看到所有类别


这应该可以做到,试试看。

我在映射中添加了nullable=true,但这并没有改变任何东西。我仍然会犯同样的错误。schema:update告诉我,由于多对一是一个集合,所以默认情况下可以为null,因此在模式中没有任何看起来合乎逻辑的更改。“empty_value”=>“-Select parent-”只适用于HTML表单,我正在构建一个API,所以我的调用是通过POSTMAN进行的。无论如何谢谢你的帮助:我错过了API部分。侧注M:1表示表中的外键,而不是集合。如果您确定ParentAcceptNull,您应该能够创建根类别。我稍后会调查,因为我正在打电话。
@ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
@ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE", nullable=true)
->add('parent', 'entity', array(
      'class'    => 'AppBundle:Category',
      'property' => 'id',
))
->add('parent', 'entity', array(
      'class'    => 'AppBundle:Category',
      'property' => 'id',
      'empty_value' => '-- Select parent --'
))