Laravel过滤器在尝试添加它们时不起作用

时间:2018-12-10 19:33:02

标签: php html laravel

所以我正在为一个项目制作Laravel,而我和我的老师正在为以下事情而努力。

在下面的代码中,常规搜索播放器是可行的,但其他语句(如果已定义)和在POST请求中不会添加到其中;

控制器:

namespace App\Http\Controllers;

use App\Http\Requests;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Input;

class FilterController extends Controller
{
    public function filter(Request $request)
    {
      $player = new \App\Player;
      $filters = $player->newQuery();
      $query = Input::get('q');

      // Search for a player based on their status.
      if ($request->has('status')) {
        $filters->orwhere('status', $request->input('status'));
      }
      // Search for a player player on their club.
      if ($request->has('club')) {
        $filters->orwhere('Club', $request->input('club'));
      }
      // Search for a player player on their team category .
      if ($request->has('Category')) {
        $filters->orwhere('Category', $request->input('Category'));
      }
      // Search for a player player if he is flagged as removed.
      if ($request->has('remove')) {
       $filters->orwhere('remove', $request->input('remove'));
      }
      // Search for a player player on their size.
      if ($request->has('size')) {
        $filters->orwhere('Size', $request->input('size'));
      }

      // General search for a player
      if($request->has('q')){
        $filters->orwhere('first_name','LIKE','%'.$query.'%')
        ->orWhere('last_name','LIKE','%'.$query.'%')
        ->orWhere('mobile','LIKE','%'.$query.'%')
        ->orWhere('street_name_nummer','LIKE','%'.$query.'%')
        ->orWhere('city','LIKE','%'.$query.'%');
      }
      // Get the results and return them.

      $results = $filters->get();

      if(count($results) > 0){
        return view('lists/ekick')->withDetails($results,$query);
      } else return view ('lists/ekick')->with('No Details found. Try to search again !');
    }
}

路线:

Route::any('lists/ekick', 'FilterController@filter');

输出视图:

img from view

2 个答案:

答案 0 :(得分:2)

要了解Aaron Sarays的答案,您很可能过滤了错误的方式。通常,附加过滤器是每个记录必须满足的附加条件,才能成为结果的一部分。如果您考虑使用Excel表并过滤一列,那么在第二列中甚至没有所有要过滤的选项,因为您已经限制了结果并且只能进一步限制它。

使用改进的过滤方式将这些知识结合在一起,您会收到如下查询:

public function filter(Request $request)
{
    $query = $request->input('q');

    $results = \App\Player::query()
        ->when($request->input('status'), function ($query, $status) {
            $query->where('status', $status);
        })
        ->when($request->input('club'), function ($query, $club) {
            $query->where('club', $club);
        })
        ->when($request->input('category'), function ($query, $category) {
            $query->where('category', $category);
        })
        ->when($request->input('remove'), function ($query, $remove) {
            $query->where('remove', $remove);
        })
        ->when($request->input('size'), function ($query, $size) {
            $query->where('size', $size);
        })
        ->when($query, function ($query, $q) {
            $query->where(function ($query) use ($q) {
                $query->where('first_name', 'LIKE', "%$q%")
                    ->orWhere('last_name', 'LIKE', "%$q%")
                    ->orWhere('mobile', 'LIKE', "%$q%")
                    ->orWhere('street_name_number', 'LIKE', "%$q%")
                    ->orWhere('city', 'LIKE', "%$q%");
            });
        })
        ->get();

    if ($results->isNotEmpty()) {
        return view('lists/ekick')->withDetails($results, $query);
    } else {
        return view ('lists/ekick')->with('No Details found. Try to search again !');
    }
}

以上查询中使用的函数when($condition, $callback)用于动态构建查询。您可以考虑以下两个语句等效:

// option 1: conditional query (preferred!)
$results = Player::query()
    ->when($request->input('q'), function ($query, $q) {
        $query->where('name', 'LIKE', "%$q%");
    })
    ->get();

// option 2: plain php query building... (not very clean code)
$query = Player::query();

if ($request->input('q')) {
    $query->where('name', 'LIKE', '%'.$request->input('q').'%');
}

$results = $query->get();

答案 1 :(得分:1)

为了执行您正在做的事情,我认为您不想在查询中使用or。您基本上是在说

  

请给我状态是某物或大小是某物的播放器

我想你的意思是

  

给我播放​​器,状态是什么,大小是什么?

取决于过滤器中是否存在要求。

因此,您想使用以下示例来更改代码:

if ($request->has('status')) {
  $filters->where('status', $request->input('status'));
}
// Search for a player player on their club.
if ($request->has('club')) {
  $filters->where('Club', $request->input('club'));
}

您还可以使用以下方法跳过一个步骤:

$query = \App\Player::getQuery();