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条评论