一对多 多对多
https://laravel-admin.org/docs/zh/model-grid.md
添加列
// 直接通过字段名`username`添加列
$grid->username('用户名');
// 效果和上面一样
$grid->column('username', '用户名');
// 显示JSON内嵌字段
$grid->column('profile->mobile', '手机号');
// 添加多列
$grid->columns('email', 'username' ...);
添加数据查询条件
默认情况下,表格的数据没有任何查询条件,可以使用model()方法来给当前表格数据添加查询条件:
$grid->model()->where('id', '>', 100);
$grid->model()->whereIn('id', [1, 2, 3]);
$grid->model()->whereBetween('votes', [1, 100]);
$grid->model()->whereColumn('updated_at', '>', 'created_at');
$grid->model()->orderBy('id', 'desc');
$grid->model()->take(100);
添加路由器
使用下面的命令来创建一个对应App\User模型的路由器
php artisan admin:make UserController --model=App\\User
// 在windows系统中
php artisan admin:make UserController --model=App\User
上面的命令会创建路由器文件app/Admin/Controllers/UserController.php.
===============================行内编辑=========================================
数据表格有一系列方法,来帮助你列表里面直接对数据进行编辑。
editable
用editable方法,可以让你在表格中点击数据,在弹出的对话框里面编辑保存数据,使用方法如下
text输入
$grid->column('title')->editable();
textarea输入
$grid->column('title')->editable('textarea');
select选择
第二个参数是select选择的选项
$grid->column('title')->editable('select', [1 => 'option1', 2 => 'option2', 3 => 'option3']);
日期选择
$grid->column('birth')->editable('date');
日期时间选择
$grid->column('published_at')->editable('datetime');
年份选择
$grid->column('year')->editable('year');
月份选择
$grid->column('month')->editable('month');
日选择
$grid->column('day')->editable('day');
switch开关
注意:在grid中对某字段设置了switch,同时需要在form里面对该字段设置同样的switch
快速将列变成开关组件,使用方法如下:
$grid->('status')->switch();
// 设置text、color、和存储值
$states = [
'on' => ['value' => 1, 'text' => '打开', 'color' => 'primary'],
'off' => ['value' => 2, 'text' => '关闭', 'color' => 'default'],
];
$grid->column('status')->switch($states);
switchGroup 开关组
注意:在grid中对某些字段设置了switch,同时需要在form里面对这些字段设置同样的switch
快速将列变成开关组件组,使用方法如下:
$states = [
'on' => ['text' => 'YES'],
'off' => ['text' => 'NO'],
];
$grid->column('switch_group')->switchGroup([
'hot' => '热门',
'new' => '最新'
'recommend' => '推荐',
], $states);
radio
将该列设置为radio组件,同时需要在form方法里面对这些字段设置同样的radio
$grid->column('options')->radio([
1 => 'Sed ut perspiciatis unde omni',
2 => 'voluptatem accusantium doloremque',
3 => 'dicta sunt explicabo',
4 => 'laudantium, totam rem aperiam',
]);
checkbox
将该列设置为checkbox组件,同时需要在form方法里面对这些字段设置同样的checkbox
$grid->column('options')->checkbox([
1 => 'Sed ut perspiciatis unde omni',
2 => 'voluptatem accusantium doloremque',
3 => 'dicta sunt explicabo',
4 => 'laudantium, totam rem aperiam',
]);
========================数据操作===============================
数据表格默认有3个行操作编辑、查看和删除,可以通过下面的方式关闭它们:
$grid->actions(function ($actions) {
// 去掉删除
$actions->disableDelete();
// 去掉编辑
$actions->disableEdit();
// 去掉查看
$actions->disableView();
});
// 全部关闭
$grid->disableActions();
可以通过传入的$actions参数来获取当前行的数据:
$grid->actions(function ($actions) {
// 当前行的数据数组
$actions->row;
// 获取当前行主键值
$actions->getKey();
});
默认情况下有一个批量删除的操作,有下面的一些使用方法
$grid->batchActions(function ($batch) {
$batch->disableDelete();
});
// 去掉批量操作
$grid->disableBatchActions();
选项卡:
https://laravel-admin.org/docs/zh/data-form#%E9%80%89%E9%A1%B9%E5%8D%A1%E8%A1%A8%E5%8D%95
==============================自定义行&批量操作======================================
https://laravel-admin.org/docs/zh/model-grid-custom-actions
行操作
https://laravel-admin.org/docs/zh/model-grid-custom-actions#%E8%A1%8C%E6%93%8D%E4%BD%9C
页面跳转
https://laravel-admin.org/docs/zh/model-grid-custom-actions#%E9%A1%B5%E9%9D%A2%E8%B7%B3%E8%BD%AC
批量操作
https://laravel-admin.org/docs/zh/model-grid-custom-actions#%E6%89%B9%E9%87%8F%E6%93%8D%E4%BD%9C
互动
https://laravel-admin.org/docs/zh/model-grid-custom-actions#%E4%BA%92%E5%8A%A8
点击操作的时候,经常会需要进行一些确认或者填写额外的数据,可以有下面两种方式来实现互动:
弹出对话框
https://laravel-admin.org/docs/zh/model-grid-custom-actions#%E5%BC%B9%E5%87%BA%E5%AF%B9%E8%AF%9D%E6%A1%86
弹出表单
https://laravel-admin.org/docs/zh/model-grid-custom-actions#%E5%BC%B9%E5%87%BA%E8%A1%A8%E5%8D%95
在handle方法中,我们要增加第二个参数来获取表单值:
use Illuminate\Http\Request;
public function handle(Model $model, Request $request)
{
// 获取到表单中的`type`值
$request->get('type');
// 获取表单中的`reason`值
$request->get('reason');
// 你的举报逻辑...
return $this->response()->success('举报已提交')->refresh();
}
目前表单支持的方法参考:
public function form()
{
// 文本输入框
$this->text('name', 'Placeholder...')->rules('required|min:10');
// Email输入框
$this->email('name', 'Placeholder...');
// IP输入框
$this->ip('name', 'Placeholder...');
// URL输入框
$this->url('name', 'Placeholder...');
// 密码输入框
$this->password('name', 'Placeholder...');
// 手机号输入框
$this->mobile('name', 'Placeholder...');
// 文本域输入框
$this->textarea('name', 'Placeholder...');
// 单选框
$this->select('name', 'Placeholder...')->options([]);
// 多选框
$this->multipleSelect('name', 'Placeholder...')->options([]);
// Checkbox
$this->checkbox('name', 'Placeholder...')->options([]);
// Radio
$this->radio('name', 'Placeholder...')->options([]);
// 上传文件
$this->file('name', 'Placeholder...');
// 上传图片
$this->image('name', 'Placeholder...');
// 时间日期选择
$this->datetime('name', 'Placeholder...');
// 日期选择
$this->date('name', 'Placeholder...');
// 时间选择
$this->time('name', 'Placeholder...');
// 隐藏
$this->hidden('name');
}
普通操作
https://laravel-admin.org/docs/zh/model-grid-custom-actions#%E6%99%AE%E9%80%9A%E6%93%8D%E4%BD%9C
假设你需要在表格头部加入一个导入数据按钮,点击之后弹出表单上传文件进行数据的导入,参考下面的步骤。
运行下面的命令创建一个普通操作类:
php artisan admin:action Post\\ImportPost --name="导入数据"
生成的类文件app/Admin/Actions/Post/ImportPost.php:
刚刚生成的代码是:
<?php
namespace App\Admin\Actions\Post;
use Encore\Admin\Actions\Action;
use Illuminate\Http\Request;
class ImportPost extends Action
{
protected $selector = '.import-post';
public function handle(Request $request)
{
// $request ...
return $this->response()->success('Success message...')->refresh();
}
public function html()
{
return <<<HTML
<a class="btn btn-sm btn-default import-post">导入数据</a>
HTML;
}
}
修改这个类,提供上传文件的功能,并加上处理数据的逻辑:
<?php
namespace App\Admin\Actions\Post;
use Encore\Admin\Actions\Action;
use Illuminate\Http\Request;
class ImportPost extends Action
{
public $name = '导入数据';
protected $selector = '.import-post';
public function handle(Request $request)
{
// 下面的代码获取到上传的文件,然后使用`maatwebsite/excel`等包来处理上传你的文件,保存到数据库
$request->file('file');
return $this->response()->success('导入完成!')->refresh();
}
public function form()
{
$this->file('file', '请选择文件');
}
public function html()
{
return <<<HTML
<a class="btn btn-sm btn-default import-post"><i class="fa fa-upload"></i>导入数据</a>
HTML;
}
}
返回数据
https://laravel-admin.org/docs/zh/model-grid-custom-actions#%E8%BF%94%E5%9B%9E%E6%95%B0%E6%8D%AE
下面是一个最简单的返回示例:
return $this->response()->success('Success!');
操作类处理完成之后,返回一个Success!的成功提示,下面是几个其它类型的返回:
// 处理错误
try {
// 处理逻辑...
return $this->response()->success('成功...');
} catch (Exception $e) {
return $this->response()->error('产生错误:'.$e->getMessage());
}
// 返回提示信息
return $this->response()->info('提示信息...');
// 返回警告信息
return $this->response()->warning('警告信息...');
返回之后刷新页面:
return $this->response()->success('Success!')->refresh();
返回之后跳转到其它页面:
return $this->response()->success('Success!')->redirect('/admin/users');
返回之后下载文件:
return $this->response()->success('Success!')->download('http://www.xxx.com/file.zip');
右键菜单
https://laravel-admin.org/docs/zh/model-grid-custom-actions#%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95
在指定页面开启:
use Encore\Admin\Grid\Displayers\ContextMenuActions;
$grid->setActionClass(ContextMenuActions::class);
或者在config/admin.php添加配置全局开启:
'grid_action_class' => \Encore\Admin\Grid\Displayers\ContextMenuActions::class,
切换操作列的形式
https://laravel-admin.org/docs/zh/model-grid-custom-actions#%E5%88%87%E6%8D%A2%E6%93%8D%E4%BD%9C%E5%88%97%E7%9A%84%E5%BD%A2%E5%BC%8F
SMS_VERIFICATION_CODE_ASYNCHRONOUS_FORBID
asynchronous
全局表格初始化
https://laravel-admin.org/docs/zh/model-grid-init
use Encore\Admin\Grid;
Grid::init(function (Grid $grid) {
$grid->disableActions();
$grid->disablePagination();
$grid->disableCreateButton();
$grid->disableFilter();
$grid->disableRowSelector();
$grid->disableColumnSelector();
$grid->disableTools();
$grid->disableExport();
$grid->actions(function (Grid\Displayers\Actions $actions) {
$actions->disableView();
$actions->disableEdit();
$actions->disableDelete();
});
});
如果全局设置后,要在其中某一个表格中开启设置,比如开启显示操作列,在对应的实例上调用$grid->disableActions(false);就可以了
批量操作 自定义写接口 弹出窗口
https://laravel-admin.org/docs/zh/model-grid-custom-tools#%E6%89%B9%E9%87%8F%E6%93%8D%E4%BD%9C
如果要添加自定义的批量操作,可以参考下面的例子
下面是扩展一个对文章批量发布的功能:
先定义操作类app/Admin/Extensions/Tools/ReleasePost.php:
<?php
namespace App\Admin\Extensions\Tools;
use Encore\Admin\Grid\Tools\BatchAction;
class ReleasePost extends BatchAction
{
protected $action;
public function __construct($action = 1)
{
$this->action = $action;
}
public function script()
{
return <<<EOT
$('{$this->getElementClass()}').on('click', function() {
$.ajax({
method: 'post',
url: '{$this->resource}/release',
data: {
_token:LA.token,
ids: selectedRows(),
action: {$this->action}
},
success: function () {
$.pjax.reload('#pjax-container');
toastr.success('操作成功');
}
});
});
EOT;
}
}
看代码的实现,通过click操作发送一个post请求,把选中的行数据id通过数组的形式传给后端接口,
后端接口拿到id列表和要修改的状态来更新数据,然后前端刷新页面(pjax reload),并弹出toastr提示操作成功。
在model-grid中加入这个批量操作功能:
$grid->tools(function ($tools) {
$tools->batch(function ($batch) {
$batch->add('发布文章', new ReleasePost(1));
$batch->add('文章下线', new ReleasePost(0));
});
});
这样批量操作下拉按钮下面就会添加两个操作项,最后一步就是添加一个接口来处理批量操作的请求了,接口代码如下:
class PostController extends Controller
{
...
public function release(Request $request)
{
foreach (Post::find($request->get('ids')) as $post) {
$post->released = $request->get('action');
$post->save();
}
}
...
}
然后添加路由指向上面的接口:
$router->post('posts/release', 'PostController@release');
这样整个流程就完成了。
数据来自外部API
https://laravel-admin.org/docs/zh/model-grid-data#%E6%95%B0%E6%8D%AE%E6%9D%A5%E8%87%AA%E5%A4%96%E9%83%A8api
==============列的显示==================
https://laravel-admin.org/docs/zh/model-grid-column-display
display回调
https://laravel-admin.org/docs/zh/model-grid-column-display#display%E5%9B%9E%E8%B0%83
display()方法来通过传入的回调函数来处理当前列的值:
$grid->column('title')->display(function ($title) {
return "<span style='color:blue'>$title</span>";
});
在传入的匿名函数中可以通过任何方式对数据进行处理,另外匿名函数绑定了当前列的数据作为父对象,可以在函数中调用当前行的数据:
$grid->column('first_name');
$grid->column('last_name');
// 不存在的`full_name`字段
$grid->column('full_name')->display(function () {
return $this->first_name . ' ' . $this->last_name;
});
根据条件显示不同的组件
https://laravel-admin.org/docs/zh/model-grid-column-display#%E6%A0%B9%E6%8D%AE%E6%9D%A1%E4%BB%B6%E6%98%BE%E7%A4%BA%E4%B8%8D%E5%90%8C%E7%9A%84%E7%BB%84%E4%BB%B6
如果这一列要根据某些条件来显示为不同的组件
$grid->column('title')->display(function ($title, $column) {
// 如果这一列的status字段的值等于1,直接显示title字段
if ($this->status == 1) {
return $title;
}
// 否则显示为editable
return $column->editable();
});
内容映射
如果字段gender的取值为f、m,分别需要用女、男来显示
$grid->column('gender')->using(['f' => '女', 'm' => '男']);
列视图
https://laravel-admin.org/docs/zh/model-grid-column-display#%E5%88%97%E8%A7%86%E5%9B%BE
使用view()方法让当前列渲染一个视图显示输出, 比如有一个视图resources/views/content.blade.php
<p>
{{ $value }}
{{ $model->id }}
</p>
默认会传入视图的两个变量,$model为当前行的模型,$value为当前列的值
然后用下面的调用来渲染这个视图输出
$grid->column('content')->view('content');
用这个方法可以很好的渲染出复杂的列内容。
列展开
https://laravel-admin.org/docs/zh/model-grid-column-display#%E5%88%97%E5%B1%95%E5%BC%80
如果一行的字段比较多,可以通过列展开功能,来隐藏过多的内容。通过点击列来展开显示,或者点击展开相关的其它数据,比如下面的例子,用来展开一条文章下的10条最新评论:
use Encore\Admin\Widgets\Table;
$grid->column('title', '标题')->expand(function ($model) {
$comments = $model->comments()->take(10)->map(function ($comment) {
return $comment->only(['id', 'content', 'created_at']);
});
return new Table(['ID', '内容', '发布时间'], $comments->toArray());
});
弹出模态框
https://laravel-admin.org/docs/zh/model-grid-column-display#%E5%BC%B9%E5%87%BA%E6%A8%A1%E6%80%81%E6%A1%86
和列展开功能类似,可以通过弹出模态框来显示更多内容
$grid->column('title', '标题')->modal('最新评论', function ($model) {
$comments = $model->comments()->take(10)->get()->map(function ($comment) {
return $comment->only(['id', 'content', 'created_at']);
});
return new Table(['ID', '内容', '发布时间'], $comments->toArray());
});
显示label标签
https://laravel-admin.org/docs/zh/model-grid-column-display#%E6%98%BE%E7%A4%BAlabel%E6%A0%87%E7%AD%BE
将字段显示为label标签, 如果字段输出为数组,会显示为多个label标签。
$grid->column('name')->label();
//设置颜色,默认`success`,可选`danger`、`warning`、`info`、`primary`、`default`、`success`
$grid->column('name')->label('danger');
// 接收数组
$grid->column('keywords')->label();
如果需要将status字段的不同的值显示为不同颜色的label
$grid->column('status')->label([
1 => 'default',
2 => 'warning',
3 => 'success',
4 => 'info',
]);
日期格式
https://laravel-admin.org/docs/zh/model-grid-column-display#%E6%97%A5%E6%9C%9F%E6%A0%BC%E5%BC%8F
如果字段值为时间戳,可以用date方法格式化输出
$grid->column('created_at')->date('Y-m-d');
将这一列转为bool值之后显示为✓和✗.
$grid->column('approved')->bool();
你也可以按照这一列的值指定显示,比如字段的值为Y和N表示true和false
$grid->column('approved')->bool(['Y' => true, 'N' => false]);
列操作
https://laravel-admin.org/docs/zh/model-grid-column-display#%E5%88%97%E6%93%8D%E4%BD%9C
==============表单组件==================
https://laravel-admin.org/docs/zh/model-form-fields
设置保存值
设置默认值
设置help信息
设置属性
设置placeholder
设置必填
设置pattern
设置readonly
设置disable
设置autofocus
model-form-tab
设置表单项组合
文本输入框
select选择框
select 联动
多选框
listbox
textarea输入框
radio选择
checkbox选择
email输入框
密码输入框
url输入框
IP输入框
电话号码输入框
颜色选择框
时间输入框
日期输入框
日期时间输入框
时间范围选择框
日期范围选框
时间日期范围选择框
货币输入框
数字输入框
比例输入框
图片上传
文件上传
多图/文件上传
地图控件
滑动选择控件
富文本编辑框
隐藏域
开关选择
显示字段
分割线
HTML
标签
图标
时区选择
table
一对多
内嵌
List
KeyValue
===================表单验证==========================
model-form使用Laravel的验证规则来验证表单提交的数据:
$form->text('title')->rules('required|min:3');
// 复杂的验证规则可以在回调里面实现
$form->text('title')->rules(function ($form) {
// 如果不是编辑状态,则添加字段唯一验证
if (!$id = $form->model()->id) {
return 'unique:users,email_address';
}
});
也可以给验证规则自定义错误提示消息:
$form->text('code')->rules('required|regex:/^\d+$/|min:10', [
'regex' => 'code必须全部为数字',
'min' => 'code不能少于10个字符',
]);
如果要允许字段为空,首先要在数据库的表里面对该字段设置为NULL,然后
$form->text('title')->rules('nullable');
创建页面规则
只在创建表单提交时生效
$form->text('title')->creationRules('required|min:3');
更新页面规则
只在更新表单提交时生效
$form->text('title')->updateRules('required|min:3');
数据库unique检查
一个比较常见的场景是提交表单是检查数据是否已经存在,可以使用下面的方式:
$form->text('username')
->creationRules(['required', "unique:user_table"])
->updateRules(['required', "unique:user_table,username,{{id}}"]);
===================模型表单回调==========================
https://laravel-admin.org/docs/zh/model-form-callback
model-form目前提供了下面几个方法来接收回调函数:
// 在表单提交前调用
$form->submitted(function (Form $form) {
//...
});
//保存前回调
$form->saving(function (Form $form) {
//...
});
//保存后回调
$form->saved(function (Form $form) {
//...
});
可以从回调参数$form中获取当前提交的表单数据:
$form->saving(function (Form $form) {
dump($form->username);
});
获取获取模型中的数据
$form->saved(function (Form $form) {
$form->model()->id;
});
可以直接在回调中返回Symfony\Component\HttpFoundation\Response的实例,来跳转或进入页面:
$form->saving(function (Form $form) {
// 返回一个简单response
return response('xxxx');
});
$form->saving(function (Form $form) {
// 跳转页面
return redirect('/admin/users');
});
$form->saving(function (Form $form) {
// 抛出异常
throw new \Exception('出错啦。。。');
});
返回错误或者成功信息在页面上:
use Illuminate\Support\MessageBag;
// 抛出错误信息
$form->saving(function ($form) {
$error = new MessageBag([
'title' => 'title...',
'message' => 'message....',
]);
return back()->with(compact('error'));
});
// 抛出成功信息
$form->saving(function ($form) {
$success = new MessageBag([
'title' => 'title...',
'message' => 'message....',
]);
return back()->with(compact('success'));
});
删除前后
since v1.6.13
在删除的前后增加了两个回调deleting和deleted。
可以直接抛出异常
$form->deleting(function () {
...
throw new \Exception('产生错误!!');
});
$form->deleted(function () {
...
throw new \Exception('hahaa');
});
直接返回一个json response,可以用来修改文案提示:
$form->deleting(function () {
...
return response()->json([
'status' => false,
'message' => '删除失败,请。。',
]);
});
$form->deleted(function () {
...
return response()->json([
'status' => false,
'message' => '删除失败,请。。',
]);
});
===================页面消息==========================
Notifications
在页面调用下面的方法,它将会调用toastr组件,在页面的右上角添加一条浮动的提示
admin_toastr('Message...', 'success');
admin_toastr('Message...', 'info');
admin_toastr('Message...', 'warning');
admin_toastr('Message...', 'error');
也可以接收第三个参数,给toastr添加设置参数,更多参数参考toastr
admin_toastr('Message...', 'success', ['timeOut' => 5000]);
Alerts
since v1.5.19
wx20180822-200500
在版本v1.5.19中调整并优化了在在页面添加Alert消息,
<?php
namespace App\Admin\Controllers;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
class PostController extends Controller
{
public function index(Content $content)
{
return $content
->withError('Title', 'messages..');
}
}
添加其它几种类型的消息
$content->withWarning('Title', 'messages..');
$content->withInfo('Title', 'messages..');
$content->withSuccess('Title', 'messages..');
也可以用下面的几个方法, 效果是一样的
admin_success($title, $message);
admin_warning($title, $message);
admin_error($title, $message);
admin_info($title, $message);
===================设置分页==========================
设置每页显示行数
$grid->paginate(15);
修改显示输出
$grid->column('text')->display(function($text) {
return str_limit($text, 30, '...');
});
$grid->column('name')->display(function ($name) {
return "<span class='label'>$name</span>";
});
$grid->column('email')->display(function ($email) {
return "mailto:$email";
});
// 添加不存在的字段
$grid->column('column_not_in_table')->display(function () {
return 'blablabla....';
});
display()方法接收的匿名函数绑定了当前行的数据对象,可以在里面调用当前行的其它字段数据
$grid->column('first_name');
$grid->column('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->disableColumnSelector();
设置分页选择器选项
$grid->perPages([10, 20, 30, 40, 50]);
自定义工具
https://laravel-admin.org/docs/zh/model-form.md
$form->tools(function (Form\Tools $tools) {
// 去掉`列表`按钮
$tools->disableList();
// 去掉`删除`按钮
$tools->disableDelete();
// 去掉`查看`按钮
$tools->disableView();
// 添加一个按钮, 参数可以是字符串, 或者实现了Renderable或Htmlable接口的对象实例
$tools->add('<a class="btn btn-sm btn-danger"><i class="fa fa-trash"></i> delete</a>');
});
表单脚部
$form->footer(function ($footer) {
// 去掉`重置`按钮
$footer->disableReset();
// 去掉`提交`按钮
$footer->disableSubmit();
// 去掉`查看`checkbox
$footer->disableViewCheck();
// 去掉`继续编辑`checkbox
$footer->disableEditingCheck();
// 去掉`继续创建`checkbox
$footer->disableCreatingCheck();
});
去掉提交按钮:
$form->disableSubmit();
去掉重置按钮:
$form->disableReset();
https://laravel-admin.org/docs/zh/model-form.md
忽略掉不需要保存的字段
$form->ignore(['column1', 'column2', 'column3']);
设置宽度
$form->setWidth(10, 2);
=================设置保存的路由 设置表单提交的action========================
$form->setAction('admin/users');
判断当前表单页是创建页面还是更新页面
=================得到现在的操作是什么==================
$form->isCreating();
$form->isUpdating();
$form->isCreating();
$form->isUpdating();
$form->isEditing()
===================关联模型==========================
关联模型
一对一
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);
}
}
通过下面的代码可以关联在一个form里面:
$form = new Form(new User);
$form->display('id');
$form->text('name');
$form->text('email');
$form->text('profile.age');
$form->text('profile.gender');
$form->datetime('created_at');
$form->datetime('updated_at');