Laravel表单如何从控制器设置默认值并从模型预填充?
Laravel表单预填充默认值的最简单方法
嘿,这个问题其实超简单的,完全不用折腾Flash数据——Laravel Collective的表单助手和Laravel的视图传值机制直接就能搞定,而且比Flash更直接!
我分两种常见场景给你说:
场景1:编辑单个产品(最常用的预填充场景)
如果是编辑页面,你只需要在控制器里获取单个产品模型,传到视图里就行:
控制器代码
// 假设通过ID获取要编辑的产品,findOrFail能避免找不到数据的报错 $product = Products::findOrFail($id); // 把模型传到视图 return view('products.edit', compact('product'));
视图里的两种写法
写法1:直接传字段值
直接把模型的product_name作为Form::text的第二个参数:
{!! Form::text('product_name', $product->product_name, ['class' => 'form-control date_pick']) !!}
写法2:绑定模型(更优雅,适合多字段表单)
用Form::model绑定整个模型,这样所有表单字段会自动从模型里取对应值,第二个参数传null就行:
{!! Form::model($product, ['route' => ['products.update', $product->id], 'method' => 'PUT']) !!} // 这里第二个参数传null,会自动填充$product->product_name {!! Form::text('product_name', null, ['class' => 'form-control date_pick']) !!} // 其他表单字段也会自动绑定模型值,比如价格、描述之类的 {!! Form::number('price', null, ['class' => 'form-control']) !!} {!! Form::close() !!}
这种方式特别适合多字段的编辑表单,不用一个个写默认值,省事儿!
场景2:创建表单,用集合里的某个产品作为默认值
如果你是创建新表单,但想从$products = Products::all();里选一个作为默认值,比如选第一个产品的名称:
控制器代码
$products = Products::all(); // 取集合里的第一个产品作为默认(也可以按条件筛选,比如最新的、热门的) $defaultProduct = $products->first(); return view('products.create', compact('defaultProduct'));
视图代码
// 用?? ''防止默认产品为空时报错,保证表单有个空的默认值 {!! Form::text('product_name', $defaultProduct->product_name ?? '', ['class' => 'form-control date_pick']) !!}
为啥不用Flash?
Flash数据是用来在重定向后临时保存数据的(比如表单验证失败,回显用户输入的内容),而你是直接从模型预填充表单,属于直接渲染视图的场景,根本不需要Flash,直接传模型数据到视图才是最直接最简单的方式~
内容的提问来源于stack exchange,提问作者vimuth
相关产品推荐
相关产品推荐

