velitsol/eloquent-filter

该包已被废弃,不再维护。没有建议的替代包。

一个用于根据URL查询字符串过滤Eloquent模型及其关系的Laravel包。

v0.1.1 2018-10-09 04:09 UTC

This package is auto-updated.

Last update: 2023-11-29 02:42:38 UTC


README

GitHub issues GitHub forks GitHub stars

一个用于根据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 许可 许可。