基于数据模型的表格
Encore\Admin\Grid类用于生成基于数据模型的表格,先来个例子,数据库中有movies表
CREATE TABLE `movies` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`director` int(10) unsigned NOT NULL,`describe` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`rate` tinyint unsigned NOT NULL,`released` enum(0, 1),`release_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
对应的数据模型为App\Models\Movie,下面的代码可以生成表movies的数据表格:
use App\Models\Movie;use Encore\Admin\Grid;use Encore\Admin\Facades\Admin;$grid = Admin::grid(Movie::class, function(Grid $grid){// 第一列显示id字段,并将这一列设置为可排序列$grid->id('ID')->sortable();// 第二列显示title字段,由于title字段名和Grid对象的title方法冲突,所以用Grid的column()方法代替$grid->column('title');// 第三列显示director字段,通过display($callback)方法设置这一列的显示内容为users表中对应的用户名$grid->director()->display(function($userId) {return User::find($userId)->name;});// 第四列显示为describe字段$grid->describe();// 第五列显示为rate字段$grid->rate();// 第六列显示released字段,通过display($callback)方法来格式化显示输出$grid->released('上映?')->display(function ($released) {return $released ? '是' : '否';});// 下面为三个时间字段的列显示$grid->release_at();$grid->created_at();$grid->updated_at();// filter($callback)方法用来设置表格的简单搜索框$grid->filter(function ($filter) {// 设置created_at字段的范围查询$filter->between('created_at', 'Created Time')->datetime();});});
基本使用方法
添加列
// 直接通过字段名`username`添加列$grid->username('用户名');// 效果和上面一样$grid->column('username', '用户名');// 添加多列$grid->columns('email', 'username' ...);
修改来源数据
$grid->model()->where('id', '>', 100);$grid->model()->orderBy('id', 'desc');$grid->model()->take(100);...
其它查询方法可以参考eloquent的查询方法.
设置每页显示行数
// 默认为每页20条$grid->paginate(15);
修改显示输出
use Illuminate\Support\Str;$grid->text()->display(function($text) {return Str::limit($text, 30, '...');});$grid->name()->display(function ($name) {return "<span class='label'>$name</span>";});$grid->email()->display(function ($email) {return "mailto:$email";});// 添加不存在的字段$grid->column('column_not_in_table')->display(function () {return 'blablabla....';});
display()方法接收的匿名函数绑定了当前行的数据对象,可以在里面调用当前行的其它字段数据
$grid->first_name();$grid->last_name();// 不存的字段列$grid->column('full_name')->display(function () {return $this->first_name.' '.$this->last_name;});
禁用创建按钮
$grid->disableCreateButton();
禁用分页条
$grid->disablePagination();
禁用查询过滤器
$grid->disableFilter();
禁用导出数据按钮
$grid->disableExport();
禁用行选择checkbox
$grid->disableRowSelector();
禁用行操作列
$grid->disableActions();
设置分页选择器选项
$grid->perPages([10, 20, 30, 40, 50]);
关联模型
一对一
users表和profiles表通过profiles.user_id字段生成一对一关联
CREATE TABLE `users` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;CREATE TABLE `profiles` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`user_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`age` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`gender` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
对应的数据模分别为:
class User extends Model{public function profile(){return $this->hasOne(Profile::class);}}class Profile extends Model{public function user(){return $this->belongsTo(User::class);}}
通过下面的代码可以关联在一个grid里面:
Admin::grid(User::class, function (Grid $grid) {$grid->id('ID')->sortable();$grid->name();$grid->email();$grid->column('profile.age');$grid->column('profile.gender');//or$grid->profile()->age();$grid->profile()->gender();$grid->created_at();$grid->updated_at();});
一对多
posts表和comments表通过comments.post_id字段生成一对多关联
CREATE TABLE `posts` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`content` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;CREATE TABLE `comments` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`post_id` int(10) unsigned NOT NULL,`content` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
对应的数据模分别为:
class Post extends Model{public function comments(){return $this->hasMany(Comment::class);}}class Comment extends Model{public function post(){return $this->belongsTo(Post::class);}}
通过下面的代码可以让两个模型在grid里面互相关联:
return Admin::grid(Post::class, function (Grid $grid) {$grid->id('id')->sortable();$grid->title();$grid->content();$grid->comments('评论数')->display(function ($comments) {$count = count($comments);return "<span class='label label-warning'>{$count}</span>";});$grid->created_at();$grid->updated_at();});return Admin::grid(Comment::class, function (Grid $grid) {$grid->id('id');$grid->post()->title();$grid->content();$grid->created_at()->sortable();$grid->updated_at();});
多对多
users和roles表通过中间表role_users产生多对多关系
CREATE TABLE `users` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`username` varchar(190) COLLATE utf8_unicode_ci NOT NULL,`password` varchar(60) COLLATE utf8_unicode_ci NOT NULL,`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,`created_at` timestamp NULL DEFAULT NULL,`updated_at` timestamp NULL DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `users_username_unique` (`username`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ciCREATE TABLE `roles` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,`slug` varchar(50) COLLATE utf8_unicode_ci NOT NULL,`created_at` timestamp NULL DEFAULT NULL,`updated_at` timestamp NULL DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `roles_name_unique` (`name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ciCREATE TABLE `role_users` (`role_id` int(11) NOT NULL,`user_id` int(11) NOT NULL,`created_at` timestamp NULL DEFAULT NULL,`updated_at` timestamp NULL DEFAULT NULL,KEY `role_users_role_id_user_id_index` (`role_id`,`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
对应的数据模分别为:
class User extends Model{public function roles(){return $this->belongsToMany(Role::class);}}class Role extends Model{public function users(){return $this->belongsToMany(User::class);}}
通过下面的代码可以让两个模型在grid里面互相关联:
return Admin::grid(User::class, function (Grid $grid) {$grid->id('ID')->sortable();$grid->username();$grid->name();$grid->roles()->display(function ($roles) {$roles = array_map(function ($role) {return "<span class='label label-success'>{$role['name']}</span>";}, $roles);return join(' ', $roles);});$grid->created_at();$grid->updated_at();});
