Symfony 2 自引用映射的属性“父”构建形式都不是

Posted

技术标签:

【中文标题】Symfony 2 自引用映射的属性“父”构建形式都不是【英文标题】:Neither the property "parent" build form Symfony 2 Self-Referenced mapping 【发布时间】:2018-07-23 18:45:28 【问题描述】:

我有一个包含自引用映射的实体。我想向系统添加新的类别和子类别,但我不知道如何正确构建添加表单。在 Entity 中生成 Get 和 setter。我收到一个错误:

既不是“父”属性也不是其中一种方法 “addParent()”/“removeParent()”、“setParent()”、“parent()”、“__set()” 或“__call()”存在并在课堂上具有公共访问权限 “Adevo\ClassifiedsBundle\Entity\ClassifiedsCategory”。

命名空间 XXX\ClassifiedsBundle\Entity; 使用 Doctrine\ORM\Mapping 作为 ORM; /** * @ORM\Entity(repositoryClass="XXX\ClassifiedsBundle\Repository\ClassifiedsCategoryRepository") * @ORM\Table(name="classifieds_categories") */ 类 ClassifiedsCategory 扩展 ClassifiedsAbstractTaxonomy /** * @ORM\OneToMany( * targetEntity = "分类广告", * mappedBy = "类别" * ) */ 受保护的$分类广告; /** * @ORM\ManyToMany(targetEntity="ClassifiedsCategory", mappedBy="parent") */ 私人 $children; /** * * @ORM\ManyToMany(targetEntity="ClassifiedsCategory", inversedBy="children") * @ORM\JoinTable(name="subCategory", * joinColumns=@ORM\JoinColumn(name="category_id", referencedColumnName="id"), * inverseJoinColumns=@ORM\JoinColumn(name="parent_id", referencedColumnName="id") * ) */ 私人$父母; /** * 构造函数 */ 公共函数 __construct() $this->children = new \Doctrine\Common\Collections\ArrayCollection(); $this->parent = new \Doctrine\Common\Collections\ArrayCollection(); /** * 添加分类 * * @param \XXX\ClassifiedsBundle\Entity\Classifieds $classified * * @return 分类分类 */ 公共函数 addClassified(\XXX\ClassifiedsBundle\Entity\Classifieds $classified) $this->classifieds[] = $classified; 返回$这个; /** * 删除分类 * * @param \XXX\ClassifiedsBundle\Entity\Classifieds $classified */ 公共函数 removeClassified(\XXX\ClassifiedsBundle\Entity\Classifieds $classified) $this->classifieds->removeElement($classified); /** * 获取分类广告 * * @return \Doctrine\Common\Collections\Collection */ 公共函数 getClassifieds() 返回 $this->classifieds; /** * 添加孩子 * * @param \XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $child * * @return 分类分类 */ 公共函数 addChild(\XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $child) $this->children[] = $child; 返回$这个; /** * 删除孩子 * * @param \XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $child */ 公共功能 removeChild(\XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $child) $this->children->removeElement($child); /** * 得到孩子 * * @return \Doctrine\Common\Collections\Collection */ 公共函数 getChildren() 返回 $this->children; /** * 添加父级 * * @param \XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $parent * * @return 分类分类 */ 公共函数 addParent(\XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $parent) $this->parent[] = $parent; 返回$这个; /** * 删除父级 * * @param \XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $parent */ 公共功能 removeParent(\XXX\ClassifiedsBundle\Entity\ClassifiedsCategory $parent) $this->parent->removeElement($parent); /** * 获取父母 * * @return \Doctrine\Common\Collections\Collection */ 公共函数 getParent() 返回 $this-> 父级;
<pre>



 namespace XXX\ClassifiedsBundle\Entity;

    use Doctrine\ORM\Mapping as ORM;


    /**
     * @ORM\MappedSuperclass
     * @ORM\HasLifecycleCallbacks
     */
    abstract class ClassifiedsAbstractTaxonomy 

        /**
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;

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

        /**
         * @ORM\Column(type="string", length=120, unique=true)
         */
        private $slug;

        protected $classifieds;


        /**
         * Constructor
         */
        public function __construct()
        
            $this->classifieds = new \Doctrine\Common\Collections\ArrayCollection();
    //        $this->children = new \Doctrine\Common\Collections\ArrayCollection();
    //        $this->parent = new \Doctrine\Common\Collections\ArrayCollection();
        

        /**
         * Add classifieds
         *
         * @param \XXX\ClassifiedsBundle\Entity\Classifieds $classifieds
         * @return ClassifiedsCategory
         */
        public function addClassifieds(\XXX\ClassifiedsBundle\Entity\Classifieds $classifieds)
        
            $this->classifieds[] = $classifieds;

            return $this;
        

        /**
         * Remove classifieds
         *
         * @param \XXX\ClassifiedsBundle\Entity\Classifieds $classifieds
         */
        public function removeClassifieds(\XXX\ClassifiedsBundle\Entity\Classifieds $classifieds)
        
            $this->classifieds->removeElement($classifieds);
        

        /**
         * Get classifieds
         *
         * @return \Doctrine\Common\Collections\Collection 
         */
        public function getCompanies()
        
            return $this->classifieds;
        

        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        
            return $this->id;
        

        /**
         * Set name
         *
         * @param string $name
         * @return AbstractTaxonomy
         */
        public function setName($name)
        
            $this->name = $name;

            return $this;
        

        /**
         * Get name
         *
         * @return string 
         */
        public function getName()
        
            return $this->name;
        

        /**
         * Set slug
         *
         * @param string $slug
         * @return AbstractTaxonomy
         */
        public function setSlug($slug)
        
            $this->slug = \XXX\ClassifiedsBundle\Libs\Utils::sluggify($slug);

            return $this;
        

        /**
         * Get slug
         *
         * @return string 
         */
        public function getSlug()
        
            return $this->slug;
        

        /**
         * @ORM\PrePersist
         * @ORM\PreUpdate
         */
        public function preSave()
            if(null === $this->slug)
                $this->setSlug($this->getName());
            
        
    

命名空间 XXX\AdminBundle\Form\Type; 使用 XXX\AdminBundle\Form\Type\ClassifiedsTaxonomyType; 使用 Symfony\Component\Form\FormBuilderInterface; 使用 Symfony\Component\OptionsResolver\OptionsResolverInterface; 类 ClassifiedsCategoryType 扩展 ClassifiedsTaxonomyType 公共函数 getName() 返回“分类”; 公共函数 buildForm(FormBuilderInterface $builder, array $options) $建造者 ->添加('名称','文本',数组( '标签' => 'Tytuł' )) ->添加('蛞蝓','文本',数组( '标签' => '别名' )) ->添加('父','实体',数组( '类' => 'XXX\ClassifiedsBundle\Entity\ClassifiedsCategory', '属性' => '名称', 'empty_value' => '选择一个父类别', '必需' => 假, )) ->添加('保存','提交',数组( '标签' => 'Zapisz' )); 公共函数 setDefaultOptions(OptionsResolverInterface $resolver) $resolver->setDefaults(数组( 'data_class' => 'XXX\ClassifiedsBundle\Entity\ClassifiedsCategory' ));

【问题讨论】:

【参考方案1】:

您的 FormType ClassifiedsCategoryType 期待 ClassifiedsCategory 的实例,这需要属性 parent 到目前为止这么好。但是当您处理从表单到控制器的请求时,formbuilder 组件会尝试通过实体上的 set 方法将输入的值设置为属性。您的实体类中缺少此 set 方法 (setParent)。

所以你必须像这样实现它:

public function setParent($parent)

    $this->parent = $parent;

    return $this;

【讨论】:

以上是关于Symfony 2 自引用映射的属性“父”构建形式都不是的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy - 将自引用关系映射为一对多(声明形式)

如何将自定义属性添加到 Symfony Doctrine YAML 映射文件

将类别父 ID 自引用表结构映射到 EF Core 实体

一对多、自引用关系 Symfony

Symfony2 将自定义字段添加到表单构建器

Symfony2 使用父级中的一个字段和具有不同注释/映射的扩展实体