T-DOC
  • Laravel-11
  • Laravel-10
  • Laravel-6X
  • Laravel-5.5
Dcat-Admin
  • Yii2
  • 重构2
  • Laravel-11
  • Laravel-10
  • Laravel-6X
  • Laravel-5.5
Dcat-Admin
  • Yii2
  • 重构2
  • 入门

    • 简介
    • 安装
    • 1.x升级指南
    • 版本升级
    • 快速开始
    • 开发前必读
    • 主题与颜色
    • 静态资源
    • 视图与自定义页面
    • 多应用 (多后台)
    • JS组件
    • 常见问题
    • Laravel Octane
  • 数据表格

    • 基本使用
    • 列的使用和扩展
    • 列的显示和扩展
    • 行的使用和扩展
    • 工具栏
    • 树状表格
    • 组合表头
    • 数据来源以及查询条件
    • 关联关系
    • 查询过滤
    • 列过滤器
    • 快捷搜索
    • 规格筛选器
    • 数据导出
    • 快捷创建
    • 行内编辑
    • 事件
    • 字段翻译
    • 数据软删除
    • 头部和脚部
    • 异步渲染
  • 数据表单

    • 基本使用
    • 图片/文件上传
    • 字段的使用
    • 字段扩展
    • 数据源
    • 表单弹窗
    • 关联关系
    • JSON表单
    • 分步表单
    • 表单验证
    • 工具表单
    • 事件以及表单响应
    • 初始化
    • 表单布局
    • 字段翻译
    • 字段动态显示
  • 数据详情

    • 基本使用
    • 字段显示
    • 关联关系
    • 字段显示扩展
    • 初始化
    • 字段翻译
  • 模型树

    • 基本使用
  • 数据仓库

    • 基本使用
  • 动作

    • 基本使用
    • 数据表格
    • 数据表单
    • 数据详情
    • 模型树
  • 多语言

    • 基本使用
  • 开发扩展

    • 扩展基本使用
    • 开发扩展
  • 页面组件

    • 异步加载
    • 图表
    • 数据统计卡片
    • 模态窗 (Modal)
    • 工具表单
    • 下拉菜单
    • 单/复选框
    • 选项卡
    • 警告框
    • 提示窗
    • Markdown
    • 卡片
  • 区块 (section)

    • 区块基本使用
  • 动作以及表单响应

    • 动作以及表单响应
  • 权限控制

    • 权限控制
  • 菜单

    • 菜单基本使用
  • 帮助函数

    • 帮助函数
  • 开发工具

    • 基本使用
  • 自定义登陆认证

    • 自定义登录
  • 自定义头部导航

    • 自定义头部导航条
  • 更新日志

    • BETA版本更新日志
    • 更新日志

关联关系

一对一

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

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;

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');
    }
}

数据仓库定义为:

<?php

namespace App\Admin\Repositories;

use Dcat\Admin\Repositories\EloquentRepository;
use User as UserModel;

class User extends EloquentRepository
{
    protected $eloquentClass = UserModel::class;
}

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

use App\Models\User;

$show->relation('author', function ($model) {
    return Show::make($model->author_id, new User(), function (Show $show) {
        // 设置路由
        $show->setResource('/users');

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

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

如果你的关联模型还需要有其他的条件查询,则可以参考以下方式

use App\Models\User;

$show->relation('author', function ($model) {
    // 模型设置查询条件
    $userModel = User::where('state', $model->state);

    return Show::make($model->author_id, $userModel, function (Show $show) {
        // 设置路由
        $show->setResource('/users');

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

简单方式

如果你只是简单的展示关联表信息,也可以这么写

// 如果你用的是模型,可以这样指定关联关系
$model = Post::with('author');

// 如果你用的是数据仓库,可以这样指定关联关系
// $repository = new Post(['author']);

return Show::make($id, $model, function (Show $show) {
    $show->field('author.id', '作者ID');
    $show->field('author.name', '作者名称');

    ...
});

如果你的关联模型名称的命名是驼峰风格,那么使用的时候需要转化为下划线风格命名

// 注意这里必须使用下划线风格命名,否则将无法显示编辑数据
$show->field('user_profile.postcode');
$show->field('user_profile.address');

一对多

一对多会以数据表格的方式呈现,下面是简单的例子

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

数据仓库定义为:

<?php

namespace App\Admin\Repositories;

use Dcat\Admin\Repositories\EloquentRepository;
use Comment as CommentModel;

class Comment extends EloquentRepository
{
    protected $eloquentClass = CommentModel::class;
}

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

use App\Admin\Repositories\Comment;

$show->relation('comments', function ($model) {
    $grid = new Grid(new Comment);

    $grid->model()->where('post_id', $model->id);

    // 设置路由
    $grid->setResource('comments');

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

    $grid->filter(function ($filter) {
        $filter->like('content')->width('300px');
    });

    return $grid;
});

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

多对多

多对多会以数据表格的方式呈现,下面是简单的例子

角色表roles和权限表permissions为多对多关系,通过中间表role_permissions关联

CREATE TABLE `roles` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
  `slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `admin_roles_name_unique` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `permissions` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
  `slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
  `http_method` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `http_path` text COLLATE utf8mb4_unicode_ci,
  `order` int(11) NOT NULL DEFAULT '0',
  `parent_id` int(11) NOT NULL DEFAULT '0',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `admin_permissions_name_unique` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `role_permissions` (
  `role_id` int(11) NOT NULL,
  `permission_id` int(11) NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  KEY `admin_role_permissions_role_id_permission_id_index` (`role_id`,`permission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

模型定义为:

class Role extends Model
{
  public function permissions() : BelongsToMany
  {
      return $this->belongsToMany(Permission::class, 'role_permissions', 'role_id', 'permission_id');
  }

}

class Permission extends Model
{
}

数据仓库定义为:

<?php

namespace App\Admin\Repositories;

use Dcat\Admin\Repositories\EloquentRepository;
use Permission as PermissionModel;

class Permission extends EloquentRepository
{
    protected $eloquentClass = PermissionModel::class;
}

那么权限的显示通过下面的代码实现:

use App\Admin\Repositories\Permission;

$show->relation('permissions', function ($model) {
    $grid = new Grid(new Permission);

    $grid->model()->join('role_permissions', function ($join) use ($model) {
        $join->on('role_permissions.permission_id', 'id')
            ->where('role_id', '=', $model->id);
    });

    // 设置路由
    $grid->setResource('auth/permissions');

    $grid->id;
    $grid->name;
    $grid->slug;
    $grid->http_path;

    $grid->filter(function (Grid\Filter $filter) {
        $filter->equal('id')->width('300px');
    });

    return $grid;
});
Last Updated:
Contributors: Hans
Prev
字段显示
Next
字段显示扩展