Laravel中WhereBetween的条件查询

时间:2018-06-20 15:20:50

标签: laravel laravel-5 eloquent

对于以下一些搜索块形式,我具有以下控制器功能部分:

    $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的结果是否有任何建议?

3 个答案:

答案 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();