PHP
laravel-admin 实现动态数据表名
laravel-admin实现model表名动态不写死
前两天因为有个需求,需要model的表名动态不写死,可由参数传入灵活变动,我也网上查找了一些资料,还是没有发现什么方法,最后直接研究了laravel-admin的源代码,并修改了部分代码,最终实现了需求。下面将这个方法介绍给大家。
由于表名是通过链接上传入,所以在接收到该参数后,重写设置gird表名,代码如下:
$TbkRebateNewGoodsModel = new TbkRebateNewGoodsModel(); $TbkRebateNewGoodsModel->setTable(request('channelGoodsTable')); return Admin::grid($TbkRebateNewGoodsModel, function (Grid $grid) { });
然后我们需要把表名参数在点击编辑、添加的时候也带入到form里,至于如何在添加、编辑按钮上带参,请看我的另一篇文章,在这里就不重复介绍了,代码如下:
$TbkRebateNewGoodsModel = new TbkRebateNewGoodsModel(); $TbkRebateNewGoodsModel->setTable(request('channelGoodsTable')); return Admin::form($TbkRebateNewGoodsModel, function (Form $form) { #获取id $id = request()->route()->parameters(); if (isset($id["tbkrebategood"])) { $id = $id["tbkrebategood"]; } else { $id = 0; } $form->hidden('table', '数据表名')->default(request('channelGoodsTable')); $form->hidden('id', 'ID')->default($id); });
然后我们需要重构添加、编辑方法,在当前控制器下重写写两个方法,代码如下:
/** * 重构添加方法 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|void */ protected function store(){ //获取表单数据 $formData = $_REQUEST; } /** * 重构编辑 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|void */ protected function update(){ //获取表单数据 $formData = $_REQUEST; }
记得把数据表也放在表单里当作某个参数,这样添加、编辑的时候就可以指定哪个表
在编辑的时候,由于需要数据展示的原因,所以我们需要改下源码,我们修改vendor\encore\laravel-admin\src下的Form.php文件,找到edit方法修改成如下
/** * Generate a edit form. * * @param $id * * @return $this */ public function edit($id, $channelGoodsTable = "") { $this->builder->setMode(Builder::MODE_EDIT); $this->builder->setResourceId($id); $this->setFieldValue($id, $channelGoodsTable); return $this; }
然后在修改该文件的setFieldValue方法,代码如下:
/** * Set all fields value in form. * * @param $id * * @return void */ protected function setFieldValue($id, $channelGoodsTable = "") { $relations = $this->getRelations(); $this->model = $this->model->with($relations)->findOrFail($id); $data = $this->model->toArray(); if ($channelGoodsTable != "") { $data = $channelGoodsTable->where('id', $id)->first()->toArray(); } $this->builder->fields()->each(function (Field $field) use ($data) { $field->fill($data); }); }
然后我们在需要动态的控制器里修改edit方法,代码如下:
public function edit($id) { return Admin::content(function (Content $content) use ($id) { #标题展示 $content->header('补贴金'); $content->description('编辑商品'); #重置表名 $TbkRebateNewGoodsModel = new TbkRebateNewGoodsModel(); $TbkRebateNewGoodsModel->setTable(request('channelGoodsTable')); $content->body($this->form()->edit($id, $TbkRebateNewGoodsModel)); }); }
这样我们就可以确保在编辑的时候,展示的数据来源也是我们指定的表
这样就可以实现model动态指定表名而不写死。
0条评论