解决方案:
要解决这个问题,您只需将宠物的注释设置为'simple_array'而不是'array'。它看起来像这样:
/**
* @ORM \ Entity
* /
class person
{
// ...
/ **
* @ORM \ Column (type = "simple_array")
*
* /
private $ pets = [];
}
解释:
发生这种情况是因为当你放置一个像数组这样的字段时,Doctrine 除了保存值之外,还会保存在数组中具有该值的索引之类的东西,所以如果你有一个人具有 cat 和 dog 值,它会存储为如下:a:2:{i:0;s:3:“猫”;我:1;s: 3: "dog";}表示该排列有 2 个元素,位置 0 是 cat,位置 1 是 dog。
然后每次生成用于编辑的视图时,将使用名称创建两个输入:
值为cat的person[pets][0]和值为dog的person[pets][1]。
但是,如果您单击“添加元素”按钮,则将考虑表单已有的输入量,以便它创建一个名为person[pets][2]的新表单,如果始终删除最后一项在列表中不会有任何问题,但是如果您删除例如名称为person[pets][0]的第一个输入,则输入量的值为 1,因此创建的新输入将与命名person[pets][1]所以你会覆盖dog的值。
但是,当在数据库中将字段pets保存为simple_array时,仅保存值:cat, dog,因此每次构造视图以编辑索引时,它们总是从头开始,永远不会被覆盖