velitsol / eloquent-filter
该包已被废弃,不再维护。没有建议的替代包。
一个用于根据URL查询字符串过滤Eloquent模型及其关系的Laravel包。
v0.1.1
2018-10-09 04:09 UTC
Requires
- php: >=5.6.0
- illuminate/support: 5.4.x
This package is auto-updated.
Last update: 2023-11-29 02:42:38 UTC
README
一个用于根据URL查询字符串过滤Eloquent模型及其关系的Laravel包。
介绍
假设我们有以下两个模型,
用户模型
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Notifications\Notifiable; use Illuminate\Auth\Authenticatable; use Illuminate\Auth\Passwords\CanResetPassword; use Illuminate\Foundation\Auth\Access\Authorizable; use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract; class User extends Model implements AuthenticatableContract, AuthorizableContract { use Authenticatable, Authorizable, CanResetPassword; use Notifiable; }
文章模型
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Post extends Model { /** * Get the publisher for this model. */ public function publisher() { return $this->belongsTo(User::class, 'user_id', 'id'); } }
现在我们想通过多个参数通过URL查询字符串返回文章列表。当我们导航到
/posts?filter['score']=4&filter['view_count']='10:100'&filter['publisher.age']='20:30'&filter['publisher.type']='guest'&filter['created_at']='02/02/2018-04/02/2018'
在控制器中,如果我们使用 $request->get('filter')
打印,我们会看到以下参数
[ score => '4', view_count => '10-100', publisher => [ age => '20-30', type => 'guest' ], created_at => '02/02/2018-04/02/2018' ]
为了通过所有这些参数过滤文章模型,我们需要做类似的事情
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Post; class PostController extends Controller { public function index(Request $request) { $query = Post::where('score', $request->input('score')); if ($request->has('view_count')) $query->whereBetween('view_count', explode('-',$request->get('view_count'))); if ($request->has('created_at')) $query->whereBetween('created_at', explode('-',$request->get('created_at'))); // filter relation if ($request->has('publisher')){ $query->whereHas('publisher', function ($q) use ($request) { $publisher = $request->get('publisher'); if(!empty($publisher['age'])) $q->whereBetween('age', explode('-',$publisher['age'])); if(!empty($publisher['type'])) $q->where('type', $publisher['type']); return $q; }); } return $query->get(); } }
您可以使用Eloquent Filter对同一模型(及其关系)进行过滤
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Post; class PostController extends Controller { public function index(Request $request) { return Post::filter()->get(); } }
安装
使用composer安装包
foo@bar:~$ composer require velitsol/eloquent-filter
使用
首先,您需要将Filterable特质添加到您的模型中,如下所示
use VelitSol\EloquentFilter\Filtrable; class Post extends Model { use Filtrable; }
在 get()
之前调用filter方法
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Post; class PostController extends Controller { public function index(Request $request) { return Post::filter()->get(); } }
支持的过滤器
相等性
/posts?field_name=value
范围
/posts?filter['field_name']='start:end'
关系
/posts?filter['relationship_name.field_name']=value
或范围
/posts?filter['relationship_name.field_name']='start:end'
因此,查询字符串应如下所示
/posts?field_name_='is-null'
此包还支持过滤附加属性。
待办事项
- 对lt、gt、lte、gte、neq查询字符串的支持
许可
此开源软件根据 MIT 许可 许可。