mayoz/eloquent-filterable

为您的 Eloquent 模型查询提供过滤器。

2.0.0 2015-11-06 22:00 UTC

This package is auto-updated.

Last update: 2024-08-27 22:35:44 UTC


README

使用本包,您可以优化在过滤器前后调用查询子句。您可以从单个接口管理您的查询。

安装

需要 PHP 5.5.9+ 或 HHVM,以及 Composer。

要获取 Eloquent Filterable 的最新版本,请将以下行添加到您的 composer.json 文件的 require 块中

"require": {
    "mayoz/eloquent-filterable": "~2.0"
}

然后,您需要运行 composer installcomposer update 来下载它并更新自动加载器。或者使用终端通过快捷方式安装

composer require mayoz/eloquent-filterable ~2.0

用法

  1. 创建您的查询过滤器。
  2. 创建您的 Eloquent 模型。
  3. 定义 Filterable 特性并在 Eloquent 模型中使用查询过滤器。

创建过滤器

所有过滤器都应该扩展 Mayoz\Filter\Filter 抽象类。因此,可以在过滤器中使用 beforeafter 方法。

前置方法

before 方法负责定位查询 WHERE 子句的头部。例如;我们需要查询 WHERE 子句中的 published = 1。但是,这个子句希望在其他子句之前执行。

<?php namespace App\Filters;

use Mayoz\Filter\Filter;

class PublishedFilter extends Filter
{
	/**
	 * The first executable filter clause.
	 *
	 * @param  mixed  $query
	 * @return void
	 */
	public function before($query)
	{
		$query->where('published', '=', 1);
	}
}

后置方法

after 方法负责定位查询 WHERE 子句的尾部。例如,如果需要查询 WHERE 子句中的 status = 'active'。但是,这个子句希望在其他子句之后执行。

<?php namespace App\Filters;

use Mayoz\Filter\Filter;

class StatusActiveFilter extends Filter
{
	/**
	 * The last executable filter clause.
	 *
	 * @param  mixed  $query
	 * @return void
	 */
	public function after($query)
	{
		$query->where('status', '=', 'active');
	}
}

创建模型

创建您的模型文件。如果您想管理查询,请将 Filterable 特性添加到模型文件中。然后,将所有关联过滤器分配给 $filters 变量。考虑以下示例

<?php namespace App;

use Illuminate\Database\Eloquent\Model;
use Mayoz\Filter\Filterable;

class Post extends Model
{
    use Filterable;

	/**
	 * The attributes that should be filter.
	 *
	 * @var array
	 */
	protected $filters = [
		'App\Filters\StatusActiveFilter',
		'App\Filters\PublishedFilter'
	];

	// other things...
}

重要:当添加(如果需要多个前置或后置过滤器)查询子句时,过滤器的顺序很重要。前置过滤器根据参考序列添加到子句的头部。同样,后置过滤器也是如此。

调试

现在 Post 模型已准备好使用。准备好了吗?好吧,我们在测试查询。别忘了启用 查询日志 以检查模型查询。

$model = \App\Post::where('views', '>', 100)->get();

查询日志输出

SELECT *
FROM   `posts`
WHERE  `published` = 1     # added by automatic filter.
  AND  `views` > 100       # user defined where clause
  AND  `status` = 'active' # added by automatic filter.

为什么要使用它?

例如,您可能只想在网站上显示访客的已批准文本。但是,管理员可以查看所有内容。创建一个新的扩展过滤器

<?php namespace App\Filters;

use Auth;
use Mayoz\Filter\Filter;

class StatusActiveFilter extends Filter
{
	/**
	 * The last executable filter clause.
	 *
	 * @param  mixed  $query
	 * @return void
	 */
	public function after($query)
	{
		# assume, the `users` table has `role` field.
		if (array_get(Auth::user(), 'role') != 'administrator')
		{
			$query->where('status', '=', 'active');
		}
	}
}

魔法,魔法!访客将只显示活动的帖子。但是管理员可以看到所有内容。好吗?

贡献

喜欢创新和简洁。请使用问题报告所有错误或建议。遵循以下贡献步骤

  1. 复制仓库。
  2. 遵循 Laravel 编码风格
  3. 如有必要,使用 unittest 检查您的更改。
  4. 提交所有更改。
  5. 推送您的提交并创建一个新的 PR。
  6. 等待合并 PR。

单元测试

请创建您的测试并在 PR 之前进行检查。使用以下命令

$ phpunit

许可

Eloquent Filterable 在 MIT 许可证 (MIT) 下授权。