数据模型详情

v1.5.16版本及以上支持

Encore\Admin\Show用来显示数据详情,先来个例子,数据库中有posts表:

CREATE TABLE `posts` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `author_id` int(10) unsigned NOT NULL ,
  `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `content` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `rate` int(255) COLLATE utf8_unicode_ci NOT NULL,
  `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\Post,下面的代码可以显示posts表的数据详情:

<?php

namespace App\Admin\Controllers;

use App\Http\Controllers\Controller;
use App\Models\Post;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use Encore\Admin\Show;

class PostController extends Controller
{
    public function show($id, Content $content)
    {
        return $content->header('Post')
            ->description('详情')
            ->body(Admin::show(Post::findOrFail($id), function (Show $show) {

                $show->id('ID');
                $show->title('标题');
                $show->content('内容');
                $show->rate();
                $show->created_at();
                $show->updated_at();
                $show->release_at();
        }));
    }
}

如果要直接显示所有的字段,可以用下面的简单方式:

$content->body(Admin::show(Post::findOrFail($id)));

如果要直接显示指定的字段:

$content->body(Admin::show(Post::findOrFail($id), ['id', 'title', 'content']));

或者指定每一个字段的label:

$content->body(Admin::show(Post::findOrFail($id), [
    'id'        => 'ID',
    'title'     => '标题',
    'content'   => '内容'
]));

基本使用方法

内容转义

为了防止XSS攻击, 默认输出的内容都会使用HTML转义,如果你想输出渲染并HTML,可以调用unescape方法:

$show->avatar()->unescape()->as(function ($avatar) {

    return "<img src='{$avatar}' />";

});

修改面板的样式和标题

$show->panel()
    ->style('danger')
    ->title('post基本信息...');

style的取值可以是primaryinfodangerwarningdefault

面板工具设置

面板右上角默认有三个按钮编辑删除列表,可以分别用下面的方式关掉它们:

$show->panel()
    ->tools(function ($tools) {
        $tools->disableEdit();
        $tools->disableList();
        $tools->disableDelete();
    });;

分隔线

如果要在字段之间添加一条分隔线:

$show->divider();

修改显示内容

用下面的方法修改显示内容

$show->title()->as(function ($title) {
    return "<{$title}>";
});

$show->contents()->as(function ($content) {
    return "<pre>{$content}</pre>";
});

下面是通过as方法内置实现的几个常用的显示样式.

image

字段avatar的内容是图片的路径或者url,可以将它显示为图片:

$show->avatar()->image();

image()方法的参数参考Field::image()

file

字段document的内容是文件的路径或者url,可以将它显示为文件:

$show->avatar()->file();

file()方法的参数参考Field::file()

link

字段homepage的内容是url链接,可以将它显示为HTML链接:

$show->homepage()->link();

link()方法的参数参考Field::link()

label

将字段tag的内容显示为label:

$show->tag()->label();

label()方法的参数参考Field::label()

badge

将字段rate的内容显示为badge:

$show->rate()->badge();

badge()方法的参数参考Field::badge()

using

如果字段gender的取值为fm,分别需要用来显示

$show->gender()->using(['f' => '女', 'm' => '男']);

关联关系显示

一对一关系

users表和上面的posts表为一对一关联关系,通过posts.author_id字段关联,users表结构如下:

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;

模型定义为:

class User extends Model
{
}

class Post extends Model
{
    public function author()
    {
        return $this->belongsTo(User::class, 'author_id');
    }
}

那么可以用下面的方式显示post所属的用户的详细:

$show->author('作者信息', function ($author) {

    $author->setResource('/admin/users');

    $author->id();
    $author->name();
    $author->email();
});

其中$author对象也是Show实例,同样可以使用上面的各种方法

注意:为了能够正常使用这个面板右上角的工具,必须用setResource()方法设置用户资源的url访问路径

一对多或多对多关系

一对多或多对多关系的关联数据会以Model-grid的方式呈现,下面是简单的例子

posts表和评论表comments为一对多关系(一条post有多条comments),通过comments.post_id字段关联

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
{
}

那么评论的显示通过下面的代码实现:

$show->comments('评论', function ($comments) {

    $comments->resource('/admin/comments');

    $comments->id();
    $comments->content()->limit(10);
    $comments->created_at();
    $comments->updated_at();

    $comments->filter(function ($filter) {
        $filter->like('content');
    });
});

$comments是一个Encore\Admin\Grid实例,详细的使用方法可以参考model-grid

注意:为了能够正常使用这个数据表格的功能,必须用resource()方法设置comments资源的url访问路径