Laravel CRUD视图:如何显示关联名称而非外键及反向转换
Laravel关联模型CRUD优化:显示名称与外键转换处理
一、创建/编辑视图:替换文本框为下拉选择框
用下拉选择框是最稳妥的方案,既能让用户直观选择制造商名称,提交时自动传递对应外键ID,还能避免手动输入的错误。
1. 控制器传递制造商数据
在create和edit方法中,先获取所有制造商的id与name,传递到视图:
// 控制器create方法 public function create() { $manufacturers = Manufacturer::pluck('name', 'id'); return view('computers.create', compact('manufacturers')); } // 控制器edit方法 public function edit(Computer $computer) { $manufacturers = Manufacturer::pluck('name', 'id'); return view('computers.edit', compact('computer', 'manufacturers')); }
2. 视图替换表单控件
把原文本框替换为下拉选择框:
<div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>制造商:</strong> {!! Form::select('manufacturer_id', $manufacturers, null, array('placeholder' => '选择制造商','class' => 'form-control')) !!} </div> </div>
- 参数说明:
manufacturer_id:表单提交的字段名,对应数据库外键$manufacturers:下拉选项数组,键为制造商ID,值为名称- 第三个参数
null:编辑时会自动读取$computer->manufacturer_id作为默认选中项(Laravel Collective Form会自动识别视图中的模型变量) - 最后一个参数:设置占位符与样式类
二、控制器处理表单提交
表单提交时直接传递manufacturer_id,所以在store和update方法中,直接验证并保存即可:
// store方法示例 public function store(Request $request) { $request->validate([ 'manufacturer_id' => 'required|exists:manufacturers,id', // 其他字段验证规则 ]); Computer::create($request->all()); return redirect()->route('computers.index')->with('success','电脑创建成功'); } // update方法示例 public function update(Request $request, Computer $computer) { $request->validate([ 'manufacturer_id' => 'required|exists:manufacturers,id', // 其他字段验证规则 ]); $computer->update($request->all()); return redirect()->route('computers.index')->with('success','电脑更新成功'); }
三、可选:文本框+名称转ID(需手动输入名称时)
如果必须用文本框让用户输入制造商名称,需要额外处理名称转ID的逻辑:
1. 视图调整文本框
<div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>制造商名称:</strong> {!! Form::text('manufacturer_name', null, array('placeholder' => '输入制造商名称','class' => 'form-control')) !!} </div> </div>
2. 控制器处理名称转ID
在store和update方法中,根据输入的名称查找对应制造商ID:
// store方法示例 public function store(Request $request) { $request->validate([ 'manufacturer_name' => 'required|exists:manufacturers,name', // 其他字段验证规则 ]); $manufacturerId = Manufacturer::where('name', $request->manufacturer_name)->value('id'); Computer::create([ 'manufacturer_id' => $manufacturerId, ...$request->except('manufacturer_name') ]); return redirect()->route('computers.index')->with('success','电脑创建成功'); } // update方法示例 public function update(Request $request, Computer $computer) { $request->validate([ 'manufacturer_name' => 'required|exists:manufacturers,name', // 其他字段验证规则 ]); $manufacturerId = Manufacturer::where('name', $request->manufacturer_name)->value('id'); $computer->update([ 'manufacturer_id' => $manufacturerId, ...$request->except('manufacturer_name') ]); return redirect()->route('computers.index')->with('success','电脑更新成功'); }
3. 编辑视图回显制造商名称
在edit方法中传递当前制造商名称:
public function edit(Computer $computer) { $manufacturerName = $computer->manufacturer->name; return view('computers.edit', compact('computer', 'manufacturerName')); }
视图中设置默认值:
{!! Form::text('manufacturer_name', $manufacturerName, array('placeholder' => '输入制造商名称','class' => 'form-control')) !!}
内容的提问来源于stack exchange,提问作者LostB
相关产品推荐
相关产品推荐

