为什么此代码有效并且 eloquent 创建子文档(如果它不存在)?

why this code works and eloquent create the subdocument if it is not exists?

假设我有一个名为 ParrentObj 的集合和一个相应的 Eloquent class 名为 ParrentObj:

[//ParentObj eloquent objects
{
    "_id":ObjectId("5e11ae242cb48f79afcd4b07"),
    "Code":"a"
    "Children":[
        //children eloquent objects
        {
            "Code":"a-a",
            "GrandChildren":[
                //GrandChildren eloquent objects
                {
                    "Code":"a-a-a"
                },
                {
                    "Code":"a-a-b"
                }
            ]           
        },
        {
            "Code":"a-b",
            "GrandChildren":[
            ]           
        }
    ],
},
{
    "_id":ObjectId("5e11b125e1f94bccca6784e9"),
    "Code":"b"
    "Children":[
    ]
}]

我很惊讶这行代码是如何正常工作的,因为所有的证据都反对它:

$result = ParrentObj::find('5e11ae242cb48f79afcd4b07')->where('Children.Code', 'a-a')
                                              ->whereNotIn('Children.GrandChildren.Code',['a-a-a'])
                                              ->push('Children.$.GrandChildren', $arr);//results: no effect on db
$result = ParrentObj::find('5e11ae242cb48f79afcd4b07')->where('Children.Code', 'a-a')
                                              ->whereNotIn('Children.GrandChildren.Code',['a-a-c'])
                                              ->push('Children.$.GrandChildren', $arr);//results:add a GrandChildren subdocument under the a-a Children

"ParrenObj" 是一个 Eloquent Object,在 Children 字段上有一个 embedsMany 关系。

"Children" 也是一个 eloquent object,在 GrandChildren 字段上有一个 "embeds many" 关系。 (至 0 或 n "GrandChildren" eloquent object(s))

据我所知,查找的结果是一个 eloquent 或集合,并结合结果将是一个查询生成器。当我尝试得到这个结果时:

$result = ParrentObj::find($id)->where('Children.Code', "a-a")->first()

结果是 ParrentObj (eloquent object)。正如我预期的那样 Children 字段有两个成员(不是一个)。 eloquent 如何确定 ->push('Children.$.GrandChildren', $arr); 应该应用于哪个 Children?

它不适用于这种情况:

$result = ParrentObj::find('5e11ae242cb48f79afcd4b07')->where('Children.Code', 'a-b')
                                          ->whereNotIn('Children.GrandChildren.Code',['a-a-a'])
                                          ->push('Children.$.GrandChildren', $arr);

预期结果:

在 a-b 子文档下添加代码为 a-a-a 的子文档

实际结果:

不在 a-b 下添加任何 GrandChildren,因为 whereNotIn 匹配了具有相同 Code 但在不同 Children 中的 GrandChildren