【问题标题】:Reducing the if elseif block Laravel filter减少 if elseif 块 Laravel 过滤器
【发布时间】:2020-05-18 11:26:32
【问题描述】:

嗨,我收到了这样的 if elseif 块:

public function competetionList(Request $request) {
        $currentAction = \Route::currentRouteAction();
  //       list($controller, $method) = explode('@', $currentAction);
  //       $controller = preg_replace('/.*\\\/', '', $controller);
  //       $method = preg_replace('/.*\\\/', '', $method);
  //       $data = $this->checkPermission($controller, $method);
        $data = true;
        if($data == true) {
            if($request->sport_id && $request->sport_type && $request->to_date && $request->from_date) {
                $competetion = Competetion::with(['sports','sporttype'])
                                          ->where('delete' , '=' , 0)   
                                          ->where('sport_id' , $request->sport_id)
                                          ->where('sport_type',$request->$sport_type)
                                          ->whereBetween('date',[$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
            } elseif($request->sport_id && $request->sport_type && !$request->to_date && !$request->from_date) {
                $competetion = Competetion::with(['sports','sporttype'])
                                          ->where('delete' , '=' , 0)   
                                          ->where('sport_id', $request->sport_id)
                                          ->where('sport_type',$request->sport_type);
            } elseif($request->sport_id && !$request->sport_type && !$request->to_date && !$request->from_date) {
                $competetion = Competetion::with(['sports','sporttype'])
                                          ->where('delete' , '=' , 0)   
                                          ->where('sport_id' , $request->sport_id);
            } elseif(!$request->sport_id && $request->sport_type && !$request->to_date && !$request->from_date) {
                $competetion = Competetion::with(['sports','sporttype'])
                                          ->where('delete' , '=' , 0)   
                                          ->where('sport_type' , $request->sport_type);
            } elseif(!$request->sport_id && $request->sport_type && $request->to_date && $request->from_date) {
                $competetion = Competetion::with(['sports','sporttype'])
                                          ->where('delete' , '=' , 0)   
                                          ->where('sport_type' , $request->sport_type)
                                          ->whereBetween('date',[$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
            } elseif($request->sport_id && !$request->sport_type && $request->to_date && $request->from_date) {
                $competetion = Competetion::with(['sports','sporttype'])
                                          ->where('delete' , '=' , 0)   
                                          ->where('sport_id' , $request->sport_id)
                                          ->whereBetween('date',[$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
            } elseif(!$request->sport_id && !$request->sport_type && !$request->to_date && !$request->from_date) {
                $competetion = Competetion::with(['sports','sporttype'])
                                          ->where('delete' , '=' , 0);

            }
            $competetionData = $competetion->orderBy('name')->get();
            $response = [
                    'status' => true,
                    'message' => 'Data Avialable',
                    'data'  => $competetionData
                ];
                return response()->json($response); //@ sending response
        } else {
            $response = [
                'status' => false,
                'message' => 'You Dont Have Permission To do it!',
            ];
            return response()->json($response); //@ sending response
        }
    }

我的问题是我怎样才能让它更简单?因为以后会有更多的过滤器!

请用这种方法帮助我

【问题讨论】:

    标签: php laravel if-statement laravel-6


    【解决方案1】:

    这是一个关于依赖注入而不是使用外观的更简单和更简洁的版本(例如,Illuminate\Routing\Router 而不是 Illuminate\Support\Facades\Route

    <?php
    
    use Illuminate\Http\Request;
    use Illuminate\Routing\Router;
    use Illuminate\Contracts\Routing\ResponseFactory;
    
        /**
         * @param  \Illuminate\Http\Request  $request
         * @param  \Illuminate\Routing\Router  $router
         * @param  \Illuminate\Contracts\Routing\ResponseFactory  $responseFactory
         * @return \Illuminate\Http\JsonResponse
         */
    public function competetionList(Request $request, Router $router, ResponseFactory $responseFactory) {
      //       [$controller, $method] = explode('@', $router->currentRouteAction());
      //       $controller = preg_replace('/.*\\\/', '', $controller);
      //       $method = preg_replace('/.*\\\/', '', $method);
      //       $data = $this->checkPermission($controller, $method);
            $data = true;
    
            if ($data) {
                $competetionData = Competetion::with(['sports', 'sporttype'])
                    ->where('delete', 0)
                    ->when($request->sport_id, function ($builder, $sport_id) {
                        return $builder->where('sport_id', $sport_id);
                    })
                    ->when($request->sport_type, function ($builder, $sport_type) {
                        return $builder->where('sport_type', $sport_type);
                    })
                    ->when($request->has(['from_date', 'to_date']), function ($builder) use ($request) {
                        return $builder->whereBetween('date', [$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
                    })
                    ->orderBy('name')
                    ->get();
    
                $responseContent = [
                    'status'    => true,
                    'message'   => 'Data Avialable',
                    'data'      => $competetionData,
                ];
    
            }
            else {
                $responseContent = [
                    'status'    => false,
                    'message'   => 'You Dont Have Permission To do it!',
                ];
            }
    
            return $responseFactory->json($responseContent);
        }
    

    【讨论】:

    • 这就是我想要的!但是这里有什么需要Router $router ??
    • 你能否修改你的答案,好像我需要检查其他表中的任何列table
    【解决方案2】:

    如果你在 laravel 5.4 以上,那么你可以使用when 方法

    public function competetionList(Request $request) {
            $data = true;
            if($data == true) {    
                $query = Competetion::with(['sports','sporttype'])
                                    ->where('delete' , '=' , 0);
    
                $query->when(isset($request->sport_id), function ($q) {
                    return $q->where('sport_id' , $request->sport_id);
                });
    
                $query->when(isset($request->sport_type), function ($q) {
                    return $q->where('sport_type' , $request->sport_type);
                });
    
                $query->when(isset($request->to_date), function ($q) {
                    return $q->whereBetween('date',[$request->from_date.' 00:00:00' , $request->to_date.' 23:59:59']);
                });
    
                $competetionData = $query->orderBy('name')->get();
                $response = [
                        'status' => true,
                        'message' => 'Data Avialable',
                        'data'  => $competetionData
                    ];
                    return response()->json($response); //@ sending response
            } else {
                $response = [
                    'status' => false,
                    'message' => 'You Dont Have Permission To do it!',
                ];
                return response()->json($response); //@ sending response
            }
        }
    

    让我知道它是否有帮助:)

    【讨论】:

      【解决方案3】:

      创建一个 where 条件数组:

      $arrayQuery [0] = ['delete', '=', 0];
      if($request->sport_id! =null) {
      array_push($arrayQuery, ['sport_id', $request->sport_id]) ;
      }
      

      对于每个 $request->xxxxx 以此类推。 他们进行查询:

      $competetion = Competetion::with(['sports','sporttype'])->where($arrayQuery) - >get() ;
      

      【讨论】:

      • 下面的答案比我的要好得多。 :)
      猜你喜欢
      • 2015-10-25
      • 2015-12-28
      • 2021-07-05
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多