如何在Backpack for Laravel的数据表中加载自定义数据?
用自定义数据生成Backpack for Laravel风格的数据表
这里提供两种实用方案,完全贴合你要的CRUD列表样式,支持Query Builder或数组数据源,还能保留操作按钮:
方案一:基于自定义CRUD控制器(推荐)
Backpack允许创建不绑定Eloquent模型的CRUD,直接对接自定义数据源:
- 生成自定义控制器
php artisan make:controller Admin/CustomDataCrudController
- 配置控制器逻辑
在控制器里跳过模型绑定,直接设置数据源和列配置:
use Backpack\CRUD\app\Http\Controllers\CrudController; use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD; use Illuminate\Support\Facades\DB; class CustomDataCrudController extends CrudController { // 只启用列表操作,按需添加其他操作 use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation; public function setup() { CRUD::setModel(false); // 告知Backpack无需关联模型 CRUD::setRoute(config('backpack.base.route_prefix') . '/custom-data'); CRUD::setEntityNameStrings('自定义数据', '自定义数据列表'); // 方式1:用Query Builder作为数据源 $customQuery = DB::table('table_a') ->select('table_a.id', 'table_a.title', 'table_b.content') ->leftJoin('table_b', 'table_a.id', '=', 'table_b.a_id'); CRUD::setDataSource($customQuery); // 方式2:用数组作为数据源 // $customData = [ // ['id' => 1, 'title' => '测试项1', 'content' => '内容1'], // ['id' => 2, 'title' => '测试项2', 'content' => '内容2'], // ]; // CRUD::setDataSource($customData); // 定义列表列,和普通CRUD完全一致 CRUD::column('id')->label('ID'); CRUD::column('title')->label('标题'); CRUD::column('content')->label('内容'); // 添加操作按钮,和CRUD列表样式统一 CRUD::addButtonFromView('line', 'edit', 'custom_edit_btn', 'end'); CRUD::addButtonFromView('line', 'delete', 'custom_delete_btn', 'end'); } }
- 自定义操作按钮视图
创建按钮视图文件,比如resources/views/vendor/backpack/crud/buttons/custom_edit_btn.blade.php:
<a href="{{ backpack_url('custom-data/'.$entry->id.'/edit') }}" class="btn btn-sm btn-link"><i class="la la-edit"></i> 编辑</a>
删除按钮视图同理,根据你的业务逻辑处理请求即可。
- 注册路由
在routes/backpack/custom.php中添加路由:
Route::crud('custom-data', 'Admin\CustomDataCrudController');
方案二:直接在视图渲染数据表
如果不想用CRUD控制器,也可以手动调用Backpack的样式和组件:
- 控制器中获取数据
public function showCustomData() { $data = DB::table('table_a') ->select('id', 'title', 'content') ->get(); // 或直接用数组 // $data = [['id' => 1, 'title' => '测试1', ...], ...]; return view('admin.custom_data', compact('data')); }
- 视图中渲染样式统一的数据表
@extends('backpack::layout') @section('content') <div class="card"> <div class="card-header"> <h3 class="card-title">自定义数据列表</h3> </div> <div class="card-body"> <table class="table table-striped table-hover datatable"> <thead> <tr> <th>ID</th> <th>标题</th> <th>内容</th> <th>操作</th> </tr> </thead> <tbody> @foreach($data as $item) <tr> <td>{{ $item->id }}</td> <td>{{ $item->title }}</td> <td>{{ $item->content }}</td> <td> <a href="{{ backpack_url('custom-data/'.$item->id.'/edit') }}" class="btn btn-sm btn-link"><i class="la la-edit"></i> 编辑</a> <a href="{{ backpack_url('custom-data/'.$item->id.'/delete') }}" class="btn btn-sm btn-link text-danger" onclick="return confirm('确定删除吗?')"><i class="la la-trash"></i> 删除</a> </td> </tr> @endforeach </tbody> </table> </div> </div> <!-- 引入Backpack的DataTable脚本,保持分页、排序功能一致 --> @push('after_scripts') <script> $('.datatable').DataTable({ responsive: true, order: [[0, 'asc']], pageLength: 10, language: { url: '{{ asset('vendor/backpack/datatables/lang/'.app()->getLocale().'.json') }}' } }); </script> @endpush @endsection
内容的提问来源于stack exchange,提问作者Max13
相关产品推荐
相关产品推荐

