为什么此代码有效并且 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
假设我有一个名为 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