对于以下一些搜索块形式,我具有以下控制器功能部分:
$manifests = DB::table('carrier_manifests')
->join('customers', 'carrier_manifests.carrierOrigin', '=', 'customers.id')
->select('carrier_manifests.*', 'customers.customer_name')
->where([
['manifestNumber', 'LIKE', '%' . $manifest . '%'],
['originTerminal','LIKE','%' . $terminal . '%'],
['carrierOrigin', $direction[0], $direction[1]],
])
->whereNull('deleted_at')
->orderBy('dateUnloaded', 'DESC')
->whereBetween('dateUnloaded', [$startDate, $endDate])
->limit(100)
->get();
由于工作流的必要性,除whereBetween
一节以外的所有部分都可以正常工作,有时子句中的dateUnloaded
并不是每个carrier_manifest
都填写,因此这意味着如果dateUnloaded
字段为空,则将其排除在搜索结果之外。
对于如何包括那些缺少dateUnloaded
的结果是否有任何建议?
答案 0 :(得分:3)
您应该能够对null值或类似值之间进行嵌套的db.mycol.aggregate([
{
$match: {
"ad.advertiser": 1399619,
"_id.createdAt": {
$gte: ISODate("2018-06-12T22:00:00.000+0000"),
$lte: ISODate("2018-06-14T22:00:00.000+0000")
}
}
},
{ $unwind: "$history"},
{
$group: {
"_id": {
"y": { "$year": "$_id.createdAt" },
"m": { "$month": "$_id.createdAt" },
"d": { "$dayOfMonth": "$_id.createdAt "},
"h": { "$hour": "$_id.createdAt" }
},
"mobile": {$sum: {$cond: ["$history.mobile", 1, 0]}},
"desktop": {$sum: {$cond: ["$history.mobile", 0, 1]}},
}
}
])
:
where()
答案 1 :(得分:0)
因此,据我了解,dateUnloaded
可能会或可能不会提供给查询。
在这种情况下,您可以使用laravel的when
方法
示例取自laravel文档 https://laravel.com/docs/5.6/queries
$users = DB::table('users')
->when($role, function ($query) use ($role) {
return $query->where('role_id', $role);
})
->get();
在这里您可以看到,如果存在$role
,那么将仅执行查询,否则将不执行。
答案 2 :(得分:0)
请尝试一下...
$manifests = DB::table('carrier_manifests')
->join('customers', 'carrier_manifests.carrierOrigin', '=', 'customers.id')
->select('carrier_manifests.*', 'customers.customer_name')
->where([
['manifestNumber', 'LIKE', '%' . $manifest . '%'],
['originTerminal','LIKE','%' . $terminal . '%'],
['carrierOrigin', $direction[0], $direction[1]],
])
->whereNull('deleted_at')
->orderBy('dateUnloaded', 'DESC')
->where(function($q) use ($startDate,$endDate){
if($endDate !="" && $startDate !=""){
$q->whereBetween('dateUnloaded', [$startDate, $endDate]);
}
return $q;
})
->limit(100)
->get();