mykeels/laravel-filters

提供了一种使用查询字符串进行数据过滤的可组合接口

dev-master 2019-09-27 12:50 UTC

README

想象一下 ...

使用查询字符串进行过滤

这个URL

/users?name=myk&age=21&company=rick-and-morty&sort_age=desc

自动知道通过响应包含 myk 的用户来过滤数据库查询

  • 年龄为 21
  • 公司名称包含 rick-and-morty
  • 并且按年龄降序排列记录,所有这些都无需你编写样板代码 😱。

加载关系

或者你可以通过在URL中添加 ?with_relationship 自动包含模型的关系,比如

等等,我马上就要向你展示了 😍。

laravel-filters

别急,我马上就要展示了 😜。

设置

  • 在终端运行 composer require mykeels/laravel-filters 来引入这个包。

使用方法

  • 在你想进行过滤的模型类中,使用 FilterableTrait
<?php

use Mykeels\Filters\Traits\FilterableTrait;

class User {
  use FilterableTrait;
  ...
}
  • 为该模型创建一个过滤器类,例如 UserFilter
<?php
namespace App\Filters;

use App\User;
use Mykeels\Filters\BaseFilters;
use Illuminate\Http\Request;
use Carbon\Carbon;

class UserFilters extends BaseFilters
{
    public function name($term) {
        return $this->builder->where('users.name', 'LIKE', "%$term%");
    }
  
    public function company($term) {
        return $this->builder->whereHas('company', function ($query) use ($term) {
            return $query->where('name', 'LIKE', "%$term%");
        });
    }
  
    public function age($term) {
        $year = Carbon::now()->subYear($age)->format('Y');
        return $this->builder->where('dob', '>=', "$year-01-01")->where('dob', '<=', "$year-12-31");
    }

    public function sort_age($type = null) {
        return $this->builder->orderBy('dob', (!$type || $type == 'asc') ? 'desc' : 'asc');
    }
}

注意每个方法的名称如何映射到查询字符串中的每个键,例如 /users?name=myk&age=21&company=rick-and-morty&sort_age=desc,以及方法参数如何映射到值。

  • 在你的控制器中注入 UserFilters 😍
<?php

namespace App\Http\Controllers;

use App\User;
use App\Filters\UserFilters;

class UserController extends Controller {
  
  public function index(Request $request, UserFilters $filters)
  {
      return User::filter($filters)->get();
  }
}

这就完了! 💃

现在,你可以启动你的应用程序,并使用过滤器允许的查询字符串变体。 🔥🔥🔥