Bug在AssociationField与autocomplete()的多对多字段在EasyAdmin



我有一个名为Question的实体,它具有多对多与另一个实体User的关系。所以我有以下表格:

question(id, field1, users)
user(id, name)
question_user(question_id, user_id)

我使用EasyAdmin创建QuestionCrud表单,其中我使用AssociationField将多个用户分配给一个问题。如果我使用AssociationField而不使用autocomplete()方法,它就像一个魅力一样工作并存储数据。但是我在User表中有大量的数据,这就是为什么我需要使用自动完成,以便只加载少量的数据。

使用autocomplete()AssociationField在表单提交时给出以下错误和验证错误:

The choices 123, 2323 do not exist in the choice list.

123、2323为所选用户id。

有人遇到过这样的问题吗?

一个月前,另一个开发人员遇到了同样的问题- https://github.com/EasyCorp/EasyAdminBundle/issues/5467。他建议编辑供应商文件src/Form/EventListener/CrudAutocompleteSubscriber.php,由于他对多对多关系中autocomplete()方法的问题进行了调查,我们提出了另一个解决方案。

我们决定重写实体存储库的findBy方法,而不是编辑供应商文件。

public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
{
if (isset($criteria['id']) && is_array($criteria['id'])) {
$ids = [];
foreach ($criteria['id'] as $id) {
if (Uuid::isValid($id)) {
$ids[] = Uuid::fromString($id)->toBinary();
} else {
$ids[] = $id;
}
}
$criteria['id'] = $ids;
}
return parent::findBy($criteria, $orderBy, $limit, $offset);
}

只要你只有一个实体作为多对多关系使用,这个解决方案是好的,但如果有几个实体,那么findBy方法应该在所有它们中被覆盖。

希望EasyAdmin的支持者能尽快修复这个bug,这样我们就不需要使用这样"丑陋"的解决方案了。

最新更新