0
我有一个小questuion。Symfony实体属性不更新
我有一个带有可重复属性标签的文章。当我编辑存在的文章,并添加新的标签都没事。但是如果从文章中的表单移除标签,这个标签仍然存在。
正如我理解的数据绑定到表单和实体。这就是新材料出现在材料中的方式。
但是为什么在绑定新的发布数据后它们不会消失?
public function editAction(Article $article, Request $request)
{
// The second parameter is used to specify on what object the role is tested.
if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
return $this->redirectToRoute('login');
}
// update Article modify date
$article->setModifyDate(new \DateTime());
// create form
$form = $this->createForm(ArticleType::class, $article, [
'manager' => $this->getDoctrine()->getManager()
]);
$form->handleRequest($request);
//print_r($article->getTags()); Deleted tag still here
UPDATE
这里是我的文章实体
**
* Class Article
* @package BackendBundle\Entity
* @ORM\Table(name="articles")
* @ORM\Entity(repositoryClass="BackendBundle\Entity\ArticleRepository")
*/
class Article
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=255, unique=true)
* @Assert\NotBlank()
*/
private $name;
/**
* @ORM\Column(type="string", length=60, unique=true)
* @Assert\NotBlank()
*/
private $alias;
/**
* @ORM\Column(type="text")
* @Assert\NotBlank()
*/
private $content;
/**
* @ORM\Column(type="integer", length=255)
* @Assert\NotBlank()
*/
private $author;
/**
* @ORM\Column(type="datetime")
* @Assert\NotBlank()
*/
private $publishDate;
/**
* @ORM\Column(type="datetime")
* @Assert\NotBlank()
*/
private $modifyDate;
/**
* @ORM\ManyToMany(targetEntity="Tag", inversedBy="articles", cascade={"persist","remove"})
* @ORM\JoinTable(
* name="articles_tags",
* joinColumns={@ORM\JoinColumn(name="article_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")})
*/
private $tags;
/**
* Article constructor.
*/
public function __construct()
{
$this->tags = new ArrayCollection();
}
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set article name.
*
* @param string $name
*
* @return $this
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Return article name.
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set articles alias.
*
* @param string $alias
*
* @return $this
*/
public function setAlias($alias)
{
$this->alias = $alias;
return $this;
}
/**
* Returns article alias.
* @return mixed
*/
public function getAlias()
{
return $this->alias;
}
/**
* Set article content.
*
* @param string $content
*
* @return $this
*/
public function setContent($content)
{
$this->content = $content;
return $this;
}
/**
* Return article content
* @return string
*/
public function getContent()
{
return $this->content;
}
/**
* Set article author
*
* @param integer $author ID of author
*
* @return mixed
*/
public function setAuthor($author)
{
$this->author = $author;
return $this;
}
/**
* Return author id.
* @return int Id of the author.
*/
public function getAuthor()
{
return $this->author;
}
/**
* Set article publish date.
*
* @param string $date
*
* @return $this
*/
public function setPublishDate($date)
{
$this->publishDate = $date;
return $this;
}
/**
* Return article publish date.
* @return string
*/
public function getPublishDate()
{
return $this->publishDate;
}
/**
* Set article modify date
*
* @param string $date
*
* @return $this
*/
public function setModifyDate($date)
{
$this->modifyDate = $date;
return $this;
}
/**
* Return article modify date
* @return string
*/
public function getModifyDate()
{
return $this->modifyDate;
}
/**
* Set tags for article.
*
* @param ArrayCollection|array $tags
*
* @return $this
*/
public function setTags($tags)
{
if (!empty($tags))
{
foreach ($tags as $tag)
{
$this->setTag($tag);
}
}
return $this;
}
/**
* Set article tag.
*
* @param Tag $tag
*
* @return $this
*
*/
public function setTag(Tag $tag)
{
if (!$this->tags->contains($tag))
{
$this->tags->set($tag->getName(), $tag);
$tag->setArticle($this);
}
return $this;
}
/**
* Remove all tags from article.
*/
public function removeTags()
{
if(!empty($this->tags))
{
foreach($this->tags as $tag)
{
$this->removeTag($tag);
}
}
return $this;
}
/**
* @param \BackendBundle\Entity\Tag $tag
*
* @return $this
*/
public function removeTag(Tag $tag)
{
if ($this->tags->contains($tag))
{
$this->tags->removeElement($tag);
$tag->removeArticle($this);
}
return $this;
}
/**
* Returns all tags for article.
* @return ArrayCollection
*/
public function getTags()
{
return $this->tags;
}
}
而且ArticleType
/**
* Class ArticleType
* @package AppBundle\Form
*/
class ArticleType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$tagTransformer = new TagTransformer($options['manager']);
$builder
->add('name', TextType::class, array(
'label_attr' => array('class' => ''),
'attr' => array('class' => 'form-control'),
'label' => 'article.name'
))
->add('alias', TextType::class, array(
'label_attr' => array('class' => ''),
'attr' => array('class' => 'form-control'),
'label' => 'article.alias'
))
->add('content', TextareaType::class, array(
'label_attr' => array('class' => ''),
'attr' => array(
'class' => 'form-control'
),
'label' => 'article.content'
))
->add('publish_date', DateType::class, array(
'label_attr' => array('class' => ''),
'attr' => array('class' => 'form-control'),
'format' => 'dd-MM-yyyy',
'label' => 'article.publish_date'
))
->add('modify_date', DateType::class, array(
'label_attr' => array('class' => ''),
'attr' => array('class' => 'form-control'),
'format' => 'dd-MM-yyyy',
'label' => 'article.modify_date'
))
->add($builder->create('tags', CollectionType::class, array(
'label' => 'article.tags',
'by_reference' => false,
'allow_add' => true,
'allow_delete' => true,
))->addViewTransformer($tagTransformer));
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'BackendBundle\Entity\Article',
));
$resolver->setRequired(array(
'manager',
));
$resolver->setAllowedTypes('manager', 'Doctrine\Common\Persistence\ObjectManager');
}
}
感谢您的答案。但是我拥有所有这些方法,而且在我的实体中有更多。 – Tapakan
你可以更新你的问题,并告诉我你的实体和表单类型?所以我可以帮你解决它。 –
已更新。非常感谢您的帮助 – Tapakan