Symfony表单Query Builder添加distinct报错:spl_object_hash参数错误
解决Symfony EntityType QueryBuilder中使用DISTINCT的报错问题
嘿,我之前也踩过这个坑!你碰到的spl_object_hash() expects parameter 1 to be object, string given错误,核心原因是EntityType字段要求QueryBuilder返回的是实体对象,而不是单个字符串字段。
问题根源
你的代码里直接写了select('DISTINCT u.town'),这会让QueryBuilder返回纯字符串类型的城镇名称,但Symfony的EntityType内部会用spl_object_hash()来处理查询结果——这个函数只认对象,给它传字符串自然就报错了。
两种针对性解决方案
根据你的实际需求选一种就行:
方案1:保留关联Core实体,仅显示唯一城镇选项
如果你最终需要提交的是Core实体对象,只是想让下拉框里的城镇不重复,用groupBy替代直接select单个字段:
->add('ville', EntityType::class, [ 'class' => Core::class, 'query_builder' => function(EntityRepository $r) { return $r->createQueryBuilder('u') ->groupBy('u.town'); // 按城镇分组,确保每个城镇只对应一个实体选项 }, 'choice_label' => 'town', ])
这样QueryBuilder返回的还是完整的Core实体,Symfony能正常处理,同时下拉框里的城镇选项是唯一的。
方案2:无需关联实体,仅用城镇字符串作为选项
如果你只需要提交城镇名称字符串,那应该换成ChoiceType,自己查询出唯一的城镇列表:
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Doctrine\ORM\EntityRepository; // ... ->add('ville', ChoiceType::class, [ 'choices' => function(EntityRepository $r) { // 查询所有唯一的城镇名称 $towns = $r->createQueryBuilder('u') ->select('DISTINCT u.town') ->getQuery() ->getScalarResult(); // 转换为ChoiceType需要的键值对格式 $townChoices = []; foreach ($towns as $town) { $townChoices[$town['town']] = $town['town']; } return $townChoices; }, ])
这个方案直接用字符串作为选项,完全避开了实体对象的处理逻辑,也就不会触发那个错误了。
内容的提问来源于stack exchange,提问作者JohnDoe
相关产品推荐
相关产品推荐

