Symfony 3.3查询报错:'id未定义',Ajax调用控制器遇问题
解决Symfony Ajax下拉框变更时的"specifiedColumn is not defined"问题
咱们先从后端代码的核心问题入手,这大概率是导致你后续前端报错的根源:
1. Doctrine查询的参数绑定完全不匹配
你写的DQL里用的占位符是:tst和:tfi,但调用setParameter时却用了'tre'和'tra',这俩完全对不上!Doctrine找不到对应的参数,自然查不到有效数据,返回的结果要么是空,要么结构不符合预期,前端自然会报错说列未定义。
修正后的后端代码应该是这样:
public function getPricesAction(Request $request) { $first = $request->request->get('first'); $final = $request->request->get('final'); $em = $this->getDoctrine()->getManager(); // 把占位符和setParameter的参数名统一匹配,同时给实体加别名避免歧义 $getPrice = $em->createQuery( 'SELECT t.id FROM CarsBundle:Travel t WHERE t.first = :first AND t.final = :final' )->setParameter('first', $first) ->setParameter('final', $final); $result = $getPrice->getResult(); return new JsonResponse($result); }
另外你担心多个setParameter的写法,其实这种链式调用是完全没问题的,Doctrine官方也推荐这么写,不用纠结~
2. 前端对返回数据的解析要对应结构
当你修正后端后,返回的JSON结构会是类似这样的数组:
[{"id":1},{"id":2},{"id":3}]
如果前端直接尝试访问id报错,大概率是遍历数据的方式不对。给你举个jQuery的示例(假设你用jQuery做Ajax):
$('select#yourFirstSelect').change(function() { var first = $(this).val(); var final = $('select#yourFinalSelect').val(); // 假设你有第二个关联下拉框 $.ajax({ url: '/your-controller-route-path', // 替换成你的实际路由路径 method: 'POST', data: {first: first, final: final}, success: function(data) { var $priceSelect = $('select#priceSelect'); $priceSelect.empty(); // 清空原有选项 // 正确遍历返回的数组,每个元素是包含id键的对象 $.each(data, function(index, item) { $priceSelect.append('<option value="' + item.id + '">' + item.id + '</option>'); }); }, error: function(xhr) { console.log(xhr.responseText); // 这里可以查看后端的错误日志,方便排查 } }); });
如果你的前端不是jQuery,核心思路一样:遍历返回的数组,每个元素是对象,必须通过item.id(或你返回的其他列名)来访问对应值,不能直接写id。
3. 额外排查小技巧
- 先确认路由配置正确:
getPricesAction对应的路由是POST请求,且能正确接收first和final参数 - 可以在后端
return new JsonResponse($result);之前,加var_dump($result);die;看看查询返回的结果是否符合预期,确认数据是存在的 - 打开浏览器开发者工具(F12),查看Network标签下的Ajax请求,看看返回的JSON数据是否正确,有没有后端报错信息
内容的提问来源于stack exchange,提问作者Nolan.K
相关产品推荐
相关产品推荐

