elfif/metasearch_l5

此软件包的最新版本(dev-master)没有可用的许可证信息。

dev-master 2020-07-21 16:01 UTC

This package is not auto-updated.

Last update: 2024-09-28 17:49:18 UTC


README

概览

Metasearch是一个Laravel 5的软件包,它允许您轻松创建与搜索表单匹配的Eloquent查询。通过在搜索表单输入字段名称中使用关键词列表,Metasearch_l5将自动创建相应的查询。它大致是activerecord-hackery/meta_search的一个移植版本。目前我正在很多REST web服务中使用它,因为它在需要一些搜索功能时提供了很大的灵活性。

以下是一个简单的示例

首先是搜索表单

{{ Form::open(['url' => URL::route('cars.search')]) }}
    {{ Form::label('year : ') }}
    {{ Form::text('year_equals') }}

	{{ Form::label('minumum horsepower : ') }}
    {{ Form::text('horsepower_greater_than') }}

	{{ Form::label('maximum horsepower : ') }}
    {{ Form::text('horsepower_less_than') }}

    {{ Form::submit('submit') }}
{{ Form::close() }}

然后在您的CarsController中

	$input = Request::all();
    $query = Search::getQuery(Car::getQuery(), $input);
    $cars = $query->get();
	return view('cars.index', ['cars' => $cars]);

就是这样,getQuery方法将根据输入内容创建查询。

安装

首先将依赖项添加到您的composer.json文件中

	"require": {
		"elfif/MetaSearch_L5" : "*"
	}

然后执行composer install。

然后编辑您的app.php文件。为此软件包添加服务提供者

	'Elfif\MetaSearch\MetaSearchServiceProvider'

并添加外观

	'Search' => 'Elfif\MetaSearch\Facades\Search'	

现在您可以开始了!!

语法

以下是所有可以在LaraSearch中使用的关键词列表,根据它们的数据类型

所有数据类型

  • equals (别名: eq) - 如其名所示。
  • does_not_equal (别名 : _noteq) - 与equals相反,奇怪的是。
  • is_in - 接受一个数组,匹配数组中的任何项。
  • is_not_in - 与上述类似,但取反。
  • is_null - 列有SQL NULL值。
  • is_not_null - 列不包含NULL。

字符串

  • _contains - 子串匹配。
  • _does_not_contain - 负面的子串匹配。
  • _starts_with (别名: _sw) - 匹配以输入项开始的字符串。
  • _does_not_start_with (别名: _dnsw) - 与上述相反。
  • _ends_with (别名: _ew) - 匹配以输入项结束的字符串。
  • _does_not_end_with (别名: _dnew) - 与上述相反。

数字、日期和时间

  • _greater_than (别名: _gt) - 大于。
  • _greater_than_or_equal (别名: _gteq) - 大于等于。
  • _less_than (别名: _lt) - 小于。
  • _less_than_or_equal (别名: _lteq) - 小于等于。

布尔值

  • _is_true - 为真。对于复选框如“仅显示管理员用户”很有用。
  • _is_false - _is_true的补充。

非布尔数据类型

  • _is_present - 与_is_true类似,用于复选框。非NULL或空字符串。
  • _is_blank - 返回在列中具有NULL或空字符串值的记录。

OR条件

如果您想匹配多个可能的列中的一个,您可以这样做

	{{ Form::label('name : ') }}
    {{ Form::text('name_or_brand_equals') }}

请记住,条件对所有列都是相同的。

查询关系存在性

简单情况

您也可以使用“exist”关键字检查关系是否存在。假设我们的汽车模型中有一个名为accessories的关系

	public function accessories(){
		return $this->hasMany('App\Accessory');
	}

我们可以这样请求该关系是否存在,使用关键字"_exists"(或_short)

	{{ Form::label('has accessories : ') }}
	{{ Form::checkbox('accessories_exists') }}

如果复选框被选中,它将添加该条件到查询构建器

	->has('accessories');
带计数

您还可以指定一个操作符和计数,进一步使用关键字"_count"(或co)加上一个关键字来定义条件自定义查询

	{{ Form::label('has accessories : ') }}
	{{ Form::text('accessories_count_greater_than') }}

将翻译成

	->has('accessories', '>=', $value);
完整条件

如果您需要更细粒度的控制关系中的条件,可以使用这种表示法,关系和字段名之间用点分隔,后面跟着条件

	{{ Form::label('accessories : ') }}
	{{ Form::text('accessories.type_contains') }}

它将被翻译为

	->whereHas('accessories', function($query){
		return $query->where('type', 'like', '%'.$value.'%');
	});