我已经搜索了一段时间,如果已经有解决方案,但似乎并不是我正在寻找的。 p>
我是mongo和php的新手,目前正在开展一个我们有很多对象的项目,这里有一些关于做什么的小样本:
(A)我创建了一份文件"活动"每个人都有: - 一个ID, - 一个名字, - 强度
所有这一切都正常,(它看起来像在php类文件中没有setter& getter)
/**
* @MongoDB\Document
*
*/
class Activite
{
/**
* @MongoDB\Id
*/
protected $id;
/**
* @MongoDB\Field(type="string")
* @Assert\NotBlank()
*/
protected $nom;
/**
* @MongoDB\Field(type="string")
* @Assert\NotBlank()
*/
protected $intensite;
}
(B)之后,我创建了另一份文件"类别"它还有: - 一个名字 - Activies的嵌入式文档
关系是一个类别可以有多个活动(OneToMany)
/**
* @MongoDB\Document
*/
class Categorie
{
/**
* @MongoDB\Id
*/
protected $id;
/**
* @MongoDB\Field(type="string")
* @Assert\NotBlank()
*/
protected $nom;
/**
* @MongoDB\EmbedMany(targetDocument="Activite")
*/
protected $activites;
public function __construct()
{
$this->activites = new \Doctrine\Common\Collections\ArrayCollection();
}
}
我已使用formbuilder
成功将我的类别添加到数据库中 public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nom',TextType::class, array(
'attr' => array(
'placeholder' => 'Nom pour la catégorie',
)))
->add
(
'activites', DocumentType::class, array
(
// extract from :
'class' => 'AppBundle:Activite',
// use property Activite.nom as dropdown choice
'choice_label' => 'nom',
// data used as display for check boxes or radio or dropdown
'multiple' => true,
'expanded' => true
// put as comment to get selectbox, dropdown, checkbox or radio
)
)
;
}
(C)我的问题来到这里,我会尽可能清楚地解释它,但这很奇怪。
(1)如果我创建了2个Activite,请让他们称之为ActTest1& ActTest2,他们将全球存在于数据库中,这很好。
(2)如果我创建2个分类,请将它们称为CatTest1& CatTest2没有勾选任何Activite以包含它们。这些文档是成功创建的,并且存在于数据库中,其中包含一个空数组的Activite(正常)
(3)如果我编辑CatTest1使ActTest1和ActTest2和CatTest2只有ActTest1
架构现在看起来像(根据我在终端中读到的内容):
[list of Activities]
(我希望它们能够独立定义,以便在每个分类中制作嵌入式副本)]
{
ID : 1
Name : ActTest1
Intensity : soft
}
,
{
ID : 2
Name : ActTest2
Intensity : Hard
}
现在:
[list of Categories]
(也是独立的)
{
ID : 3
Name : CatTest1
Activities :
[
{
ID : 1
Name : ActTest1
Intensity : soft
},
{
ID : 2
Name : ActTest2
Intensity : Hard
}
]
},
{
ID : 4
Name : CatTest2
Activities :
[
{
ID : 1
Name : ActTest1
Intensity : soft
}
]
}
(4)现在,如果我编辑CatTest1并且我取消了ActTest2以将其从数组中删除,ActTest2应该仅作为嵌入文档存在于CatTest1中,它也会从活动列表中删除Activity ActTest2
现在看起来像那样(根据我在终端中读到的内容):
[list of Activities]
(我希望它们能够独立定义,以便在每个分类中制作嵌入式副本)]
{
ID : 1
Name : ActTest1
Intensity : soft
}
和:
[list of Categories]
怪异
{
ID : 3
Name : CatTest1
Activities :
[
{
ID : 1
Name : ActTest1
Intensity : soft
}
]
},
{
ID : 4
Name : CatTest2
Activities :
[
{
ID : 1
Name : ActTest1
Intensity : soft
}
]
}
我真的不明白为什么会这样做。是因为在formbuilder中,当我从数据库中获取数据来制作表单时,因为当我从父节点删除副本时它是完全复制的(ID)以及它也删除了子节点原创的东西?
(5)我的第二个问题是关于更新,我们以前看到父级中的副本绑定到全局定义的子级,因此如果父级的修改调用了子级的修改,我预期修改了孩子会对包含这个孩子(或至少是其副本)的父母进行修改
如果我保留删除后的示例,如果我编辑ActTest1将其重命名为ActTest3并将强度更改为Hard我得到此结果:
[list of Activities]
{
ID : 1
Name : ActTest3
Intensity : hard
}
和:
[list of Categories]
仍然很奇怪
{
ID : 3
Name : CatTest1
Activities :
[
{
ID : 1
Name : ActTest1
Intensity : soft
}
]
},
{
ID : 4
Name : CatTest2
Activities :
[
{
ID : 1
Name : ActTest1
Intensity : soft
}
]
}
我还可以删除新的ActTest3,它不会影响CatTest1,也不会影响CatTest2
我对任何建议或解释持开放态度,必须有一些我错过或没有正确理解的东西,但此刻,我已经迷失了。