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。我收到一个错误:
命名空间 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-> 父级;既不是“父”属性也不是其中一种方法 “addParent()”/“removeParent()”、“setParent()”、“parent()”、“__set()” 或“__call()”存在并在课堂上具有公共访问权限 “Adevo\ClassifiedsBundle\Entity\ClassifiedsCategory”。
<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 - 将自引用关系映射为一对多(声明形式)