Laravel-admin删除行操作回调无法获得模型id的解决办法
2019-10-24 admin laravel 2866
在phpexcel查询系统中,使用了bgsx存储各项目的基本属性,bm对就了项目的具体数据表。后台使用了Laravel-admin,遇到了一个问题是,删除bgsx这一行时,需要同时删除对应的bm的数据表。也就是说,删除行时,需要获得该行的模型id或bm,官方文档方法:
//删除后回调获取bm,再删除对应表 $form->deleted(function () { $bm = $this->row->bm;//当前行bm Schema::dropIfExists($bm);//删除bm对应的数据表 });
经测试无法获取到模型数据。又从github一个网友的方法里找到代码:
$form->deleting(function () { $url = Input::url();//通过链接地址获取id $arr = explode("/", $url); $id = end($arr); });
测试依然无效。
百度一下午,资料实在太少,只找到这一方法:
public static function boot() { parent::boot(); static::deleted(function ($model) { //这样可以拿到当前操作id dd($model->id); }); }
再次测试,删除操作无数次,依然是删除成功却无法回调得到数据。晚上,认真阅读源码,最后直接修改源码实现了该过程。文件路径:
/vendor/encore/laravel-admin/src/Grid/Actions/Delete.php
原代码:
namespace Encore\Admin\Grid\Actions; use Encore\Admin\Actions\Response; use Encore\Admin\Actions\RowAction; use Illuminate\Database\Eloquent\Model; class Delete extends RowAction { /** * @return array|null|string */ public function name() { return __('admin.delete'); } /** * @param Model $model * * @return Response */ public function handle(Model $model) { $trans = [ 'failed' => trans('admin.delete_failed'), 'succeeded' => trans('admin.delete_succeeded'), ]; try { $model->delete(); } catch (\Exception $exception) { return $this->response()->error("{$trans['failed']} : {$exception->getMessage()}"); } return $this->response()->success($trans['succeeded'])->refresh(); } /** * @return void */ public function dialog() { $this->question(trans('admin.delete_confirm'), '', ['confirmButtonColor' => '#d33']); } }
修改后的代码:
namespace Encore\Admin\Grid\Actions; use Encore\Admin\Actions\Response; use Encore\Admin\Actions\RowAction; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Schema; class Delete extends RowAction { /** * @return array|null|string */ public function name() { return __('admin.delete'); } /** * @param Model $model * * @return Response */ public function handle(Model $model) { $trans = [ 'failed' => trans('admin.delete_failed'), 'succeeded' => trans('admin.delete_succeeded'), ]; try { if (isset($model->bm)){ $bm = $model->bm;//查询项目的表名 Schema::dropIfExists($bm);//先删除项目表名,再删除bgsx这行 } if (isset($model->cjdb)){ $bm = $model->cjdb;//删除成绩对比表 Schema::dropIfExists($bm); } $model->delete(); } catch (\Exception $exception) { return $this->response()->error("{$trans['failed']} : {$exception->getMessage()}"); } return $this->response()->success($trans['succeeded'])->refresh(); } /** * @return void */ public function dialog() { $this->question(trans('admin.delete_confirm'), '', ['confirmButtonColor' => '#d33']); } }
2020年1月9日,官方文档已更新,删除回调方法已在1.7.0以上版本去除了,因此需要在model里使用模型删除回调,来获取该行的数据。修改bgsxModel,最终完美的实现:
use Illuminate\Support\Facades\Schema; //删除回调 public static function boot() { parent::boot(); static::deleted(function ($model) { $bm = $model->bm;//当前行bm Schema::dropIfExists($bm);//删除bm对应的数据表 }); }
模型删除回调解决了laravel-admin删除回调问题,也避免了第一种方法,直接改源码导致更新后又要修改的不足。