我有一个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还是明确指定此操作?谢谢!
答案 0 :(得分:0)
我注意到getTags()函数返回ArrayCollection。 这很好。但是我也在setTags()中调用getTags()来计算currTags和ModifiedTags之间的差异。 所以我在ArrayCollection实例中进行了更改。 但是当我使用$ this->标签
时一旦ArrayCollection由实体管理器持久化和管理 它变成了PersistentCollection,它的行为恰好具有 的ArrayCollection (got from here???)
在Article类中,Doctrine \ ORM \ PersistentCollection的哪个实例改为$ this-> getTags() - 一切都开始运行良好。 所以现在我需要了解Doctrine \ ORM \ PersistentCollection和ArrayCollection之间的区别