vojtasim / laravel-grid
基本的Laravel数据网格系统,用于简化大型表的排序和筛选。不包含任何前端垃圾代码,因此外观由您负责
此包的官方仓库似乎已消失,因此已冻结此包
Requires
- php: >=5.4.0
- laravel/framework: 5.*
README
基本的Laravel数据网格系统,用于简化大型表的排序和筛选。不包含任何前端垃圾代码,因此外观由您负责。
安装
composer require vojtasim/laravel-grid
在 config/app.php 中的提供者中添加以下行
\VojtaSim\LaravelGrid\DataGridServiceProvider::class,
然后添加DataGrid门面的别名
'DataGrid' => \VojtaSim\LaravelGrid\Facades\DataGrid::class,
然后您可以执行以下命令来发布视图文件
artisan vendor:publish --provider="\VojtaSim\LaravelGrid\DataGridServiceProvider"
视图
表单
首先,我们需要创建一个表单来容纳所有筛选输入。为此,请使用 @grid 指令,它接受两个参数。
- 网格名称:用于控制器或 @grid - @endgrid 范围之外来引用特定网格
- 路由:筛选和排序请求应发送到的路由
@grid('products', 'products.index') - @endgrid
排序
接下来,我们可以通过使用 @gridColumn
指令来添加排序列。此指令也接受两个参数。
- 列名称
- 文本翻译
<th>@gridColumn('name', 'products.name')</th>
如果您想通过相对模型列进行筛选,您将需要连接表并别名所需的列。
$query->select(['products.*', DB::raw('brands.name AS brand_name')]) ->leftJoin('brands', 'products.brand_id', '=', 'brands.id');
<th>@gridColumn('brand_name', 'products.brand')
筛选
筛选输入通过 @gridTextFilter
或 @gridSelectFilter
指令创建。
@gridTextFilter 只接受两个参数,即您希望筛选的列的名称以及筛选是否精确(意味着筛选是否使用 column like %value%
或 column = value
)
@gridTextFilter('name', true/false)
@gridSelectFilter 有多种选项可以用于筛选列,所以让我们称它为
-
通过
key => value
对的数组作为选项进行筛选@gridSelectFilter('is_available', trans('products.availabilityStates'))
'availabilityStates' => ['0' => '不可用', '1' => '可用
],` -
通过 Collection of models进行筛选
@gridSelectFilter('supplier_id', $suppliers, ['id' => 'name'])
第二个参数是模型集合,第三个是包含用作 key 和 value 的每个选项的键的数组的数组
-
通过ManyToMany关系进行筛选
@gridSelectFilter('categories:id', $categories, ['id' => 'name'])
在这里,列名称被替换为我们希望筛选的关系的名称。冒号后面的字符串是查询关系的列的名称。例如,您可以通过以下方式筛选类别
@gridSelectFilter('categories:name', $categories, ['name' => 'name'])
-
通过计数进行筛选
使用 @gridSelectFilter('relatedProducts:has', trans('products.relatedFilterStates'))
在这个示例中,冒号后面的字符串是
has
,这意味着 QueryBuilder 的->has()
函数将被用于查询关系。'relatedFilterStates' => ['=:0' => '未分配', '>:0' => '已分配'],
每个选项的键必须由运算符和值组成,以正确过滤关系。
-
按多个值过滤
1. - 3. 中的每个选项也可以按多个值进行过滤。为此,将第 4 个参数指定为
true
。@gridSelectFilter('is_available', trans('products.availabilityStates'), null, true)
@gridSelectFilter('supplier_id', $suppliers, ['id' => 'name'], true)
@gridSelectFilter('categories:name', $categories, ['name' => 'name'], true)
分页
@gridPerPage() - 用于显示“每页”选择的指令
<div class="panel-body"> {!! $products->appends(grid_parameters())->links() !!} <div class="pull-right"> <label>@lang('grid.itemsPerPage')</label> @gridPerPage([10, 20, 50, 100]) </div> </div>
辅助函数
grid_parameters([ string $gridName]) - 返回用于创建路由的当前排序和过滤参数。当需要创建自定义操作时,理想的选择。
route('products.custom_action', array_merge(['parameter' => 'value'], grid_parameters()))
grid_checkbox([ string $gridName]) - 用于创建用于批量操作的复选框名称的函数
<input type="checkbox" name="{{ grid_checkbox() }}" value="{{ $product->id }}">
grid_action([ string $gridName]) - 用于创建批量操作按钮名称的函数
<button type="submit" name="{{ grid_action() }}" value="destroy" class="btn btn-efault"> <i class="fa fa-remove"></i> <span>@lang('products.destroy')</span> </button>
grid_column_class(string|array $column [, $gridName]) - 用于获取指定列的 CSS 类的函数
返回 grid-filtered
和/或 grid-sorted
<colgroup> <col> <col class="{{ grid_column_class('name') }}"> <col class="{{ grid_column_class(['brand_id', 'brand_name']) }}"> <col class="{{ grid_column_class(['manufacturer_id', 'manufacturer_name']) }}"> <col class="{{ grid_column_class('is_active') }}"> <col> </colgroup>
grid_clear_link([ string $gridName]) - 返回清除所有过滤和排序的链接的函数
控制器
在控制器中,您将主要使用 2 个函数:applyConditions()
和 getSelected()
。您还可以使用 getFilters()
来检索以 column => value
对的形式存在的过滤值数组(注意:未过滤的列不会包含在数组中)
示例 #1:应用条件和执行批量操作
use App\Http\Controllers\Controller, Illuminate\Http\Request, VojtaSim\LaravelGrid\Services\DataGrid; // ... public function index(Request $request, DataGrid $grid) { if ($items = $grid->getSelected('products')) { // $items = {"action": (string), "selected": (array)} if (method_exists($this, ($method = "{$items->action}Products"))) { return $this->{$method}($request, $items->selected); } } $query = Product::with(['brand', 'categories', 'relatedProducts']) ->select(['products.*', DB::raw('brands.name as brand_name')]) ->leftJoin('brands', 'products.brand_id', '=', 'brands.id'); $products = $grid->applyConditions('products', $query); $brands = Products\Brand::orderBy('name', 'asc')->get(); $categories = Products\Category::orderBy('name', 'asc')->get(); return view('products.index', compact('products', 'brands', 'categories', 'manufacturers')); }
示例 #2 - 获取过滤值
use App\Http\Controllers\Controller, Illuminate\Http\Request, VojtaSim\LaravelGrid\Services\DataGrid; // ... public function index(Request $request, DataGrid $grid) { if ($items = $grid->getSelected('products')) { // $items = {"action": (string), "selected": (array)} if (method_exists($this, ($method = "{$items->action}Products"))) { return $this->{$method}($request, $items->selected); } } $query = Product::with(['manufacturer', 'productSeries',]) ->select(['products.*', DB::raw('manufacturers.name as manufacturer_name'), DB::raw('printer_series.name as series_name') ]) ->leftJoin('manufacturers', 'products.manufacturer_id', '=', 'manufacturers.id') ->leftJoin('printer_series', 'products.product_series_id', '=', 'product_series.id'); $products = $grid->applyConditions('products', $query); $manufacturers = Manufacturer::orderBy('name', 'asc')->get(); $series = Series::orderBy('name', 'asc')->get(); if ($selectedManufacturers = $grid->getFilters('products', 'manufacturer_id')) { $series->whereIn('products_series.manufacturer_id', $selectedManufacturers); } $series = $series->get(); return view('products.index', compact('products', 'manufacturers', 'series')); }