EasyAdmin中多对多字段AssociationField使用autocomplete()的Bug
问题:EasyAdmin多对多关联使用autocomplete提交时出现选项不存在错误
我有一个Question实体,与User实体为多对多关联,对应的数据表结构如下:
question(id, field1, users) user(id, name) question_user(question_id, user_id)
使用EasyAdmin创建QuestionCrud表单时,通过AssociationField为Question分配多个User。不使用autocomplete()方法时功能正常,数据可正常存储,但因User表数据量极大,必须通过autocomplete()实现懒加载以减少数据加载量。
然而添加autocomplete()后,表单提交时出现如下验证错误:
The choices 123, 2323 do not exist in the choice list.
其中123、2323为选中用户的ID。
解决方法
自定义autocomplete查询逻辑,确保已选用户被包含
默认autocomplete仅加载匹配搜索关键词的少量数据,而表单验证会校验选中ID是否在当前选项列表内。可通过自定义查询构建器,让已选中的用户始终被包含在查询结果中:AssociationField::new('users') ->autocomplete() ->setQueryBuilder(function (EntityRepository $repo, $queryBuilder) { $request = Request::createFromGlobals(); // 获取提交的已选用户ID(编辑场景适用) $selectedIds = $request->request->get('Question')['users'] ?? []; if (!empty($selectedIds)) { $queryBuilder->andWhere('entity.id IN (:selectedIds)') ->setParameter('selectedIds', $selectedIds); } // 保留搜索匹配逻辑 $searchQuery = $request->query->get('query'); if ($searchQuery) { $queryBuilder->andWhere('entity.name LIKE :search') ->setParameter('search', '%' . $searchQuery . '%'); } return $queryBuilder; });临时关闭选项验证(不推荐)
若无需严格校验选项合法性,可通过设置choice_validation为false跳过验证,但此方法存在安全风险,仅适合内部信任系统使用:AssociationField::new('users') ->autocomplete() ->setFormTypeOption('choice_validation', false);检查实体主键映射
确认User实体的主键字段(id)被正确映射,EasyAdmin的autocomplete依赖正确的实体标识符匹配选项,主键映射异常也会引发此类错误。
内容的提问来源于stack exchange,提问作者Bakhtiyor
相关产品推荐
相关产品推荐

