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

发表评论