Symfony2 表单效果不佳(相关的 oneToMany 实体未被删除)
Symfony2 Form works bad(Related oneToMany entities are not deleted)
我有一个 Article
和 Tags
个实体。
我想创建表单来编辑 Article
和相关的 Tags
。 (还有很多其他关系,但目前不重要)
在我的例子中,添加新标签效果很好。但是如果我想删除一些标签,或者编辑现有的,这不会发生,我也不会收到错误。据我所知,$em->flush()
应该可以解决所有问题,但事实并非如此。
我还检查了我的引擎——它是 InnoDB。我已经创建了外键。
我正在使用 TextType::class
编辑标签。因此,如果我想删除其中一个标签,我应该将其从此列表中删除。
click to see tag input
表单元素
$builder->add($builder->create('custom_tags', TextType::class, [])->addModelTransformer(function(){/*to array*/}, function(){/*to string*/} );
我按照文档所述绑定了这些实体:
文章实体:
/**
* Article entity
*
* @ORM\Table(name="Article")
* @ORM\Entity
*/
class Article
{
/**
* Article can have zero or more tags
*
* @OneToMany(targetEntity="Tag", mappedBy="article",
* cascade={"persist", "remove"}, orphanRemoval=true)
*/
private $tags;
public function __construct() {
$this->tags = new ArrayCollection();
}
public function setTags($tags) {
$currTags = $this->getTags();
....
// calculating the difference between currTags and ModifiedTags
//here I got ArrayCollection with new tags entities list, without already deleted tags
$this->tags = $tags;
return $this;
}
public function getTags() {
return $this->tags->matching(Criteria::create()->orderBy(["id" => Criteria::DESC]);
}
...
标记实体
/**
* Tag
*
* @ORM\Table(name="Tag")
* @ORM\Entity
*/
class Tag
{
/**
* @var Article
*
* Many Tags can be present in one article.
*
* @ManyToOne(targetEntity="Article", inversedBy="tags")
* @JoinColumn(name="article_id", referencedColumnName="id")
*/
private $article;
...
我花了很多时间来查找信息并解决这个问题...
谁能给我一些建议,告诉我我错过了什么或提供一些链接?我应该手动实现 remove_action 还是明确指定此操作?谢谢!
我注意到 getTags() 函数 returns ArrayCollection。
这很好。但我也在 setTags() 中调用 getTags() 来计算 currTags 和 ModifiedTags 之间的差异。
所以我正在对 ArrayCollection 实例进行更改。
但是当我开始使用 $this->tags
Once an ArrayCollection is persisted and managed by the entity manager
it becomes a PersistentCollection it behaves exactly has an
ArrayCollection
(got from here???)
Doctrine\ORM\PersistentCollection 的哪个实例代替文章 class 中的 $this->getTags() - 一切都开始运行良好。
所以现在我需要阅读 Doctrine\ORM\PersistentCollection 和 ArrayCollection
之间的区别
我有一个 Article
和 Tags
个实体。
我想创建表单来编辑 Article
和相关的 Tags
。 (还有很多其他关系,但目前不重要)
在我的例子中,添加新标签效果很好。但是如果我想删除一些标签,或者编辑现有的,这不会发生,我也不会收到错误。据我所知,$em->flush()
应该可以解决所有问题,但事实并非如此。
我还检查了我的引擎——它是 InnoDB。我已经创建了外键。
我正在使用 TextType::class
编辑标签。因此,如果我想删除其中一个标签,我应该将其从此列表中删除。
click to see tag input
表单元素
$builder->add($builder->create('custom_tags', TextType::class, [])->addModelTransformer(function(){/*to array*/}, function(){/*to string*/} );
我按照文档所述绑定了这些实体:
文章实体:
/**
* Article entity
*
* @ORM\Table(name="Article")
* @ORM\Entity
*/
class Article
{
/**
* Article can have zero or more tags
*
* @OneToMany(targetEntity="Tag", mappedBy="article",
* cascade={"persist", "remove"}, orphanRemoval=true)
*/
private $tags;
public function __construct() {
$this->tags = new ArrayCollection();
}
public function setTags($tags) {
$currTags = $this->getTags();
....
// calculating the difference between currTags and ModifiedTags
//here I got ArrayCollection with new tags entities list, without already deleted tags
$this->tags = $tags;
return $this;
}
public function getTags() {
return $this->tags->matching(Criteria::create()->orderBy(["id" => Criteria::DESC]);
}
...
标记实体
/**
* Tag
*
* @ORM\Table(name="Tag")
* @ORM\Entity
*/
class Tag
{
/**
* @var Article
*
* Many Tags can be present in one article.
*
* @ManyToOne(targetEntity="Article", inversedBy="tags")
* @JoinColumn(name="article_id", referencedColumnName="id")
*/
private $article;
...
我花了很多时间来查找信息并解决这个问题... 谁能给我一些建议,告诉我我错过了什么或提供一些链接?我应该手动实现 remove_action 还是明确指定此操作?谢谢!
我注意到 getTags() 函数 returns ArrayCollection。 这很好。但我也在 setTags() 中调用 getTags() 来计算 currTags 和 ModifiedTags 之间的差异。 所以我正在对 ArrayCollection 实例进行更改。 但是当我开始使用 $this->tags
Once an ArrayCollection is persisted and managed by the entity manager it becomes a PersistentCollection it behaves exactly has an ArrayCollection (got from here???)
Doctrine\ORM\PersistentCollection 的哪个实例代替文章 class 中的 $this->getTags() - 一切都开始运行良好。 所以现在我需要阅读 Doctrine\ORM\PersistentCollection 和 ArrayCollection
之间的区别