Symfony查询问题:无法获取指定用户的全部已购卡片
排查用户已购卡片查询异常的问题
咱们一步步拆解你代码里的问题,帮你定位异常原因:
1. 参数类型不匹配(最可能的直接原因)
你的Controller调用getUserCardAction时,传入的是$this->getUser()——这是一个User实体对象,但Service方法getUserCardAction的参数$userId期望的是数字/字符串类型的用户ID。两者类型不匹配,会导致Doctrine查询时无法正确绑定参数,直接抛出异常。
修复方式:传入用户的ID值,同时增加未登录判断:
public function getUserCard() { $user = $this->getUser(); if (!$user) { return $this->error('用户未登录,请先登录'); // 根据你的框架错误处理方式调整 } // 传入用户ID而非User对象 $cards = $this->get('card.configuration')->getUserCardAction($user->getId()); return $this->success($cards); }
2. Controller未返回查询结果
原Controller调用完Service后直接返回$this->success(),没有把查询到的卡片数据传递进去,就算查询成功,前端也拿不到任何结果。
修复方式:将Service返回的卡片集合作为参数传给success方法:
return $this->success($cards);
3. 检查Doctrine实体字段映射
你提到数据库表cards里有user_id字段,但需要确认你的Card实体类中对应的属性配置是否正确:
- 如果实体里用的是普通字段(非关联关系),属性名应为
$userId,且注解要对应数据库字段:
// Card实体类中的配置示例 /** * @ORM\Column(name="user_id", type="integer", nullable=false) */ private $userId;
- 如果实体里是关联User的关系(比如
@ORM\ManyToOne(targetEntity="User")),那QueryBuilder里应该用关联属性名(比如c.user),且参数要传User对象,这时候你的Service方法参数需要调整为User对象,而不是ID。
4. 增加异常捕获与调试
为了快速定位具体错误,可以在Service里增加异常捕获,打印或记录错误信息:
public function getUserCardAction($userId) { try { $cards = $this->getCardRepository() ->createQueryBuilder('c') ->where('c.userId = :userId') ->setParameter('userId', $userId) ->getQuery() ->getResult(); return $cards; } catch (\Exception $e) { // 临时打印错误信息(生产环境建议记录日志) var_dump($e->getMessage()); // 抛出异常让上层处理 throw new \RuntimeException('获取用户卡片失败', 0, $e); } }
内容的提问来源于stack exchange,提问作者Филип Стојановић
相关产品推荐
相关产品推荐

