我必须检查laravel 5中同一个表中具有相同值的两个字段。我使用的是Mongodb。
{
"id": "565d23ef5c2a4c9454355679",
"title": "Event1",
"summary": "test",
"total": NumberInt(87),
"remaining": NumberInt(87),
"status": "1"
}
我需要检查“总计”和“剩余”字段是否相同。如何在laravel 5.1中编写查询。请帮忙。
答案 0 :(得分:0)
您可以采用的一种方法是使用底层驱动程序提供的原始MongoDB集合对象中的聚合框架方法。在mongo shell中,您实际上将运行以下聚合管道操作来比较两个字段并返回满足该条件的文档:
db.collection.aggregate([
{
"$project": {
"isMatch": { "$eq" : ["$total", "$remaining"] }, // similar to "valueof(total) == valueof(remaining)"
"id" : 1,
"title" : 1,
"summary" : 1,
"total" : 1,
"remaining" : 1,
"status" : 1
}
},
{
"$match": { "isMatch": true } // filter to get documents that only satisfy "valueof(total) == valueof(remaining)"
}
]);
db.collection.find({ "$where" : "this.total == this.remaining" })
因此,在laravel中,您可以使用 raw expressions 获取文档,如下所示
$result = DB::collection("collectionName") -> raw(function ($collection)
{
return $collection->aggregate(array(
array(
"$project" => array(
"id" => 1,
"title" => 1,
"summary" => 1,
"total" => 1,
"remaining" => 1,
"status" => 1,
"isMatch" => array(
"$eq" => array( "$total", "$remaining" )
)
)
),
array(
"$match" => array(
"isMatch" => true
)
)
));
});
如果是 $where
,您可以将表达式直接插入查询中:
Model::whereRaw(array("$where" => "this.total == this.remaining"))->get();
或者在查询构建器上执行的内部MongoCollection对象上使用原始表达式。请注意,使用 raw()
方法需要使用游标,因为它是一个低级别调用:
$result = Model::raw()->find(array("$where" => "this.total == this.remaining"));