Dcat Admin 文档 Help

表格数据源

数据仓库(Repository )是一个可以提供特定接口对数据进行读写操作的类,通过数据仓库的引入,可以让页面的构建不再关心数据读写功能的具体实现,开发者只需要实现特定的操作接口即可轻松切换数据源。关于数据仓库的详细用法请参考文档数据仓库

数据来自模型

当数据源支持Eloquent Model时,只需创建一个简单的Repository类继承Dcat\Admin\Repositories\EloquentRepository即可

<?php namespace App\Admin\Repositories; use Dcat\Admin\Repositories\EloquentRepository; use App\Models\Movie as MovieModel; class Movie extends EloquentRepository { // 这里定义你的模型类名 protected $eloquentClass = MovieModel::class; // 通过这个方法可以指定查询的字段,默认"*" public function getGridColumns() { return [$this->getKeyName(), 'name', 'title', 'created_at']; } }

直接使用模型

如果你还觉得创建 Repository 类麻烦,也可以直接把 Eloquent Model 的实例传递到 Grid 中,底层会自动把 Eloquent Model 转化为 EloquentRepository 实例

use App\Models\Movie as MovieModel; $grid = new Grid(new MovieModel()); ...

修改来源数据

1、使用 Grid\Model

use App\Admin\Repositories\Movie; $grid = new Grid(new Movie()); // 添加默认查询条件 $grid->model()->where('id', '>', 100); // 设置初始排序条件 $grid->model()->orderBy('id', 'desc'); ...

其它查询方法可以参考eloquent的查询方法。

2、使用 Model Query

use App\Models\Movie as MovieModel; $grid = new Grid(MovieModel::where('id', '>', 100)); ...

关联数据

有以下三种方式让你的表格支持关联数据

1、使用Repository

use App\Admin\Repositories\Movie; // 相当于 MovieModel::with('categories') $grid = new Grid(new Movie(['categories'])); $grid->categories; ...

2、使用 Grid\Model

use App\Admin\Repositories\Movie; $grid = new Grid(new Movie()); $grid->model()->with('categories'); $grid->categories; ...

3、使用 Model Query

use App\Models\Movie as MovieModel; $grid = new Grid(MovieModel::with('categories')); $grid->categories; ...

数据来自外部API

示例

如果数据是来自外部的API,只需要覆写Repository中的get方法既可, 具体用法可参考下面的示例,采用豆瓣电影API获取并展示数据:

<?php namespace App\Admin\Repositories; use Dcat\Admin\Grid; use Dcat\Admin\Repositories\Repository; use Illuminate\Pagination\LengthAwarePaginator; class ComingSoon extends Repository { protected $api = 'https://api.douban.com/v2/movie/coming_soon'; /** * 定义主键字段名称 * * @return string */ public function getPrimaryKeyColumn() { return '_id'; } /** * 查询表格数据 * * @param Grid\Model $model * @return LengthAwarePaginator */ public function get(Grid\Model $model) { // 当前页数 $currentPage = $model->getCurrentPage(); // 每页显示行数 $perPage = $model->getPerPage(); // 获取排序字段 [$orderColumn, $orderType] = $model->getSort(); // 获取"scope"筛选值 $city = $model->filter()->input(Grid\Filter\Scope::QUERY_NAME, '广州'); // 如果设置了其他过滤器字段,也可以通过“input”方法获取值,如: $title = $model->filter()->input('title'); if ($title !== null) { // 执行你的筛选逻辑 } $start = ($currentPage - 1) * $perPage; $client = new \GuzzleHttp\Client(); $response = $client->get("{$this->api}?{$this->apiKey}&city=$city&start=$start&count=$perPage"); $data = json_decode((string)$response->getBody(), true); return $model->makePaginator( $data['total'] ?? 0, // 传入总记录数 $data['subjects'] ?? [] // 传入数据二维数组 ); } }

Grid\Model 常用方法

获取当前页数 (getCurrentPage)

获取当前页码

  • 返回值: int|null 如果不允许分页返回null

$page = $model->getCurrentPage();

获取每页显示行数 (getPerPage)

获取每页显示行数

  • 返回值: int|null 如果不允许分页返回null

$limit = $model->getPerPage();

获取排序字段 (getSort)

获取排序字段

  • 返回值: array [$orderColumn, 'desc'|'asc'] ||[null, null]

// $orderColumn 字段名称,如没有进行排序则为 null // $orderType 正序或倒序: "desc"、"asc",如没有进行排序则为 null list($orderColumn, $orderType) = $model->getSort();

获取过滤器对象 (filter)

获取过滤器对象,通过过滤器对象可以获取到搜索表单的值,用法如下

  • 返回值 Dcat\Admin\Grid\Filter

// 获取"scope"筛选值 $city = $model->filter()->input(Grid\Filter\Scope::QUERY_NAME, '广州'); // 如果设置了其他过滤器字段,也可以通过“input”方法获取值,如: $title = $model->filter()->input('title'); if ($title !== null) { // 执行你的筛选逻辑 }

获取快捷搜索表单值

通过以下方式可以获取到快捷搜索表单值

$quickSearch = $model->grid()->quickSearch()->value();

数据来自复杂SQL查询

如果来源数据需要执行比较复杂的SQL语句获取,那么有两个办法, 第一个办法就是上面的方法,覆盖掉Repositoryget方法实现。

Last modified: 30 八月 2024