Laravel 8如何将数据库读取的分类数据渲染到产品表单下拉选择框
问题原因
你遇到的$categories未定义报错,是因为渲染产品表单的控制器方法没有把分类数据以$categories变量的形式传递给视图,和你视图里@foreach的变量写法无关。你现有视图中的遍历写法是正确的,不需要修改。
解决步骤
1. 在ProductController中新增对应方法
你现有控制器里只有列表查询的index和view方法,缺少返回产品新增表单的方法,新增create方法如下:
<?php namespace App\Http\Controllers; use App\Models\Product; use App\Models\Category; use Illuminate\Http\Request; class ProductController extends Controller { // 原有方法保留 public function index() { $products = Product::all(); return view('products/index', ['products'=>$products]); } public function view() { $products = Product::with('category')->get(); $categories = Category::with('products')->get(); return view ('product.view')-> with([ 'products' => $products, 'categories' => $categories, ]); } // 新增返回产品表单的方法 public function create() { // 查询所有分类数据,不需要关联产品,降低查询开销 $categories = Category::all(); // 此处替换为你自己的表单视图实际路径即可 return view('products.create', compact('categories')); } // 原有处理产品上传的方法保留即可 }
2. 配置对应路由
在routes/web.php中新增访问表单的路由,指向刚才的create方法:
use App\Http\Controllers\ProductController; // 访问产品新增表单的路由,放在上传路由之前 Route::get('/product/create', [ProductController::class, 'create']); // 你原有处理表单提交的路由保留即可 Route::post('/upload_product', [ProductController::class, '你的上传处理方法名']);
可选优化
- 你现有视图里的默认选项属性写错了,把
disable改为disabled即可生效:<option disabled selected>--select category--</option> - 如果这个分类下拉框在多个视图中都有使用,不想每个控制器方法都重复传
$categories变量,可以在app/Providers/AppServiceProvider.php的boot方法中配置视图共享:
use App\Models\Category; public function boot() { // 所有视图都可以直接获取$categories变量 view()->share('categories', Category::all()); }
内容的提问来源于stack exchange,提问作者Bakhtawar Ashraf
相关产品推荐
相关产品推荐

