减少 if elseif 块 Laravel 过滤器

Reducing the if elseif block Laravel filter

嗨,我得到了一个 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
        }
    }

我的问题是如何让它更简单??因为以后会有更多的滤镜!

请帮助我这个方法

如果你在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
        }
    }

如果有帮助请告诉我:)

这里是关于依赖注入而不是使用外观的更简单和更清晰的版本(例如 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);
    }

创建一个 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() ;