Symfony — выбор EntityType повторяет ту же опцию

Создание формы в Symfony 3.3.4 и использование EntityType для получения списка выбора объектов.

По какой-то причине, когда я использую определенный объект, список выбора возвращает все те же параметры с одинаковыми идентификаторами, даже если таблица базы данных содержит строки с разными идентификаторами и именами.

$form->add('projectComplexity', EntityType::class, array(
    'class' => 'AppBundle:ProjectComplexity',
    'choice_label' => 'name',
    'choice_value' => 'id',
    'placeholder' => 'Choose an option',
    'label_attr' => array('title' => 'Project complexity associated with this project'),
    'query_builder' => function (EntityRepository $v) {
        return $v->createQueryBuilder('v')->orderBy('v.name',' ASC');
    },
))

введите здесь описание изображения

Использование того же формата для добавления других объектов работает нормально.

Вот полный класс типа формы:

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityRepository;

class ProductType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('productCategory', EntityType::class,
                array(
                    'class' => 'AppBundle:ProductCategory',
                    'choice_label' => 'name',
                    'choice_value' => 'id',
                    'placeholder' => 'Choose an option',
                    'label_attr' => array('title' => 'Category for this product'),
                    'query_builder' => function (EntityRepository $v) {
                        return $v->createQueryBuilder('v')
                            ->orderBy('v.name',' ASC');
                    }
                ))
            ->add('name',TextType::class)
            ->add('detail',TextType::class)
            ->add('description',TextareaType::class, array(
                'attr' => array('cols' => '80', 'rows' => '10')
            ))
            ->add('supportDescription',TextareaType::class, array(
                'attr' => array('cols' => '80', 'rows' => '10')
            ))
            ->add('isCircuit', CheckboxType::class,  array('required' => false))
            ->add('deliveryType', EntityType::class,
                array(
                    'class' => 'AppBundle:DeliveryType',
                    'choice_label' => 'name',
                    'choice_value' => 'id',
                    'label_attr' => array('title' => 'Type of delivery for this product'),
                    'query_builder' => function (EntityRepository $v) {
                        return $v->createQueryBuilder('v')
                            ->orderBy('v.name',' ASC');
                    }
                ))
            ->add('projectComplexity', EntityType::class,
                array(
                    'class' => 'AppBundle:ProjectComplexity',
                    'choice_label' => 'name',
                    'choice_value' => 'id',
                    'placeholder' => 'Choose an option',
                    'label_attr' => array('title' => 'Project complexity associated with this project'),
                    'query_builder' => function (EntityRepository $v) {
                        return $v->createQueryBuilder('v')
                            ->orderBy('v.name',' ASC');
                    }
                ))
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Product'
            )
        );
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'app_bundle_product_type';
    }
}

person Geoff Maddock    schedule 20.07.2017    source источник
comment
Что произойдет, если, скажем, в контроллере вы повторите этот запрос QueryBuidler и выгрузите результаты? Все то же самое? Или вы видите разные значения?   -  person Jason Roman    schedule 21.07.2017
comment
Извините за банальность, но проверяли ли вы значения, которые у вас есть в БД? Потому что выглядит нормально.   -  person Artur Yukhatov    schedule 21.07.2017
comment
Не могли бы вы опубликовать свой полный тип формы?   -  person ste    schedule 21.07.2017
comment
Совершенно разумная мысль, Артур. Я проверил и подтвердил, что БД содержит разные строки. Любопытно, что выбор содержит один и тот же идентификатор и значение для каждого из трех вариантов. Добавление полного типа формы в исходное сообщение.   -  person Geoff Maddock    schedule 24.07.2017
comment
Еще не решил это. Одна странная вещь: если я добавляю в таблицу больше строк, она возвращает правильное количество результатов, но все они показывают один и тот же результат с одним и тем же значением.   -  person Geoff Maddock    schedule 29.07.2017


Ответы (1)


Я понял, что здесь происходит. Это была проблема с конфигурацией объекта ProjectComplexity, которая возникла в результате обратного проектирования конфигурации аннотаций ORM из базы данных.

Наконец я заметил, что в классе сущностей ProjectComplexity идентификатор PK был BOOLEAN:

/**
 * @var boolean
 *
 * @ORM\Column(name="id", type="boolean")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

Я сгенерировал этот объект, используя метод обратного проектирования, описанный на веб-сайте Symfony, и, глядя на определение столбца в базе данных, столбец id в этой таблице был tinyint(3). Я могу только предположить, что реверс-инжиниринг по умолчанию преобразуется в логическое значение.

Как только я изменил аннотацию, чтобы использовать целое число, это сработало, как и ожидалось:

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;
person Geoff Maddock    schedule 04.08.2017