Laravel如何根据输入框值查询数据库并将对应第二列内容填充到其他字段
问题排查与修复方案
现有代码核心问题
- 请求方法与路由定义不匹配:AJAX发起的是
POST请求,但路由里注册的是GET类型,请求会直接报405错误 - 缺少Laravel CSRF校验参数:POST请求必须携带CSRF令牌,否则会返回419状态码错误
- 控制器查询逻辑不符合需求:
pluck("c_name","cd_id")返回的是cd_id为键、c_name为值的对象,你需要的是单条匹配记录的c_name值,无需返回关联id,且未做查询结果为空的判断 - AJAX成功回调未实现填充逻辑:当前仅alert返回数据,没有把值写入第二个输入框,且输入值校验逻辑不严谨,空字符串未被拦截
- 可选优化:输入框name是数组格式
ccode[],如果是多行动态表单的话重复id会导致事件绑定失效,单条场景下不影响
修复步骤
1. 路由调整(改为POST匹配AJAX请求)
Route::post('getcodename',[DropdownController::class, 'getcodename'])->name('getcodename');
2. 前端代码调整
首先在HTML的<head>标签内添加CSRF元标签:
<meta name="csrf-token" content="{{ csrf_token() }}">
修改JS逻辑,增加CSRF配置、完善校验和填充逻辑:
$(document).ready(function(){ // 全局设置AJAX的CSRF头,无需每个请求单独传参 $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); $('#target').change(function(){ var code = $('#target').val().trim(); // 空值直接清空第二个输入框 if(!code){ $('#codename').val(''); return; } $.ajax({ type: "POST", url: "{{ route('getcodename') }}", data: {code:code}, success:function(data){ // 有匹配值就填充,无匹配就清空输入框 $('#codename').val(data || ''); } }); }); });
3. 控制器逻辑调整(优化查询和返回值)
public function getcodename(Request $request) { // 校验参数合法性 $request->validate([ 'code' => 'required|string' ]); // 直接取匹配的第一条记录的c_name字段值 $codename = DB::table("communitydata") ->where("code", $request->code) ->value('c_name'); // 直接返回字符串,前端可直接使用 return $codename ?? ''; }
内容的提问来源于stack exchange,提问作者Muhammad Tufail
相关产品推荐
相关产品推荐

