这里有新的Symfony2用户。我有2个相关的实体,一个到多个是单向的。我将其作为ManyToMany作为doctrine documentation suggests,Article(一)和Tags(很多)。我希望复选框显示在article.new页面和article.edit页面上显示标签名称。在表单提交时,标记实体的id存储在实体生成器为我创建的article_tags边表中。
仅发布相关代码。
标记实体 AppBundle / Entity / Tag.php
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=20)
*/
public $name;
文章实体 AppBundle / Entity / Article.php
/**
* @ORM\ManyToMany(targetEntity="Tag")
* @ORM\JoinTable(
* name="article_tags",
* joinColumns={@ORM\JoinColumn(name="article_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id", unique=true)}
* )
*/
protected $tags;
/**
* Add tag
*
* @param \AppBundle\Entity\Tag $tag
*
* @return Article
*/
public function addTag(\AppBundle\Entity\Tag $tag)
{
$this->tags[] = $tag;
return $this;
}
/**
* Remove tag
*
* @param \AppBundle\Entity\Tag $tag
*/
public function removeTag(\AppBundle\Entity\Tag $tag)
{
$this->tags->removeElement($tag);
}
/**
* Get tags
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getTags()
{
return $this->tags;
}
文章表单类型 AppBundle / Form / ArticleType
$builder->add('title')
->add('body')
->add('author')
->add('tags', 'entity', array(
'class' => 'AppBundle\Entity\Tag',
'property' => 'name',
'expanded' => 'true', ));
ArticleController AppBundle / Controller / ArticleController.php
* @Template()
*/
public function newAction()
{
$entity = new Article();
$tags = new Tag();
$entity->addTag($tags);
$form = $this->createCreateForm($entity);
return array('entity' => $entity,'form' => $form->createView(), );
}
截至目前,我收到的错误是......
必须管理传递到选择字段的实体。也许坚持下去 他们在实体经理?
我并不完全确定我是在正确的轨道上。我只是想把标签贴在文章上!
由于
答案 0 :(得分:1)
在控制器中,您创建一个空白标记,并在创建表单之前将其添加到新文章中。这对我来说没有意义,我怀疑这是错误的来源。
如果数据库中有任何标签,Symfony将自动获取它们并使用表单中的复选框显示它们。如果用户选中了复选框,则此标记将添加到文章中。
只需删除这两行就可以了:
$tags = new Tag();
$entity->addTag($tags);