Ошибка в AssociationField с автозаполнением () для поля «многие ко многим» в 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 — идентификаторы выбранных пользователей.

Кто-нибудь сталкивался с такой проблемой?

Можем ли мы увидеть всю конфигурацию вашего поля

Dylan KAS 06.12.2022 09:59

Это работает: yield AssociationField::new('users')->setFormTypeOption('by_refere‌​nce', false) Это НЕ РАБОТАЕТ: yield AssociationField::new('users')->setFormTypeOption('by_refere‌​nce ', ложь) -> автозаполнение()

Bakhtiyor 06.12.2022 10:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
2
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Месяц назад с такой же проблемой столкнулся еще один разработчик — 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 скоро исправят эту ошибку, и нам не придется использовать такие «уродливые» решения.

Другие вопросы по теме