У меня есть сущность под названием 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 — идентификаторы выбранных пользователей.
Кто-нибудь сталкивался с такой проблемой?
Это работает: yield AssociationField::new('users')->setFormTypeOption('by_reference', false) Это НЕ РАБОТАЕТ: yield AssociationField::new('users')->setFormTypeOption('by_reference ', ложь) -> автозаполнение()




Месяц назад с такой же проблемой столкнулся еще один разработчик — https://github.com/EasyCorp/EasyAdminBundle/issues/5467. Он предложил отредактировать файл поставщика src/Form/EventListener/CrudAutocompleteSubscriber.php, и благодаря его исследованию того, что не так с методом autocomplete() в отношениях «многие ко многим», мы нашли другое решение.
Вместо редактирования файла поставщика мы решили переопределить метод findBy репозитория Entity.
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 скоро исправят эту ошибку, и нам не придется использовать такие «уродливые» решения.
Можем ли мы увидеть всю конфигурацию вашего поля