mongodb中的嵌入式文档:删除/更新时的单边关系

时间:2016-07-18 10:20:54

标签: php mongodb formbuilder

我已经搜索了一段时间,如果已经有解决方案,但似乎并不是我正在寻找的。

我是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

我对任何建议或解释持开放态度,必须有一些我错过或没有正确理解的东西,但此刻,我已经迷失了。

0 个答案:

没有答案