Symfony2 Entity Field Тип текущего выбора

Я пытаюсь создать тип поля сущности в форме. Вот код:

$extraSpecsRepository = $this -> getDoctrine() 
                              -> getRepository('LabsCatalogBundle:Specs'); 
$availQuery = $extraSpecsRepository->createQueryBuilder('sel')
                ->where("sel.cat = '0'")
                ->getQuery();
$available = $availQuery->getResult();


$extraSpecsRepository = $this -> getDoctrine() 
                              -> getRepository('LabsCatalogBundle:ProductExtraspecs'); 
$selQuery = $extraSpecsRepository->createQueryBuilder('sel')
                  ->join('sel.specs', 'specs')
                  ->where("specs.cat = '0' AND sel.regmatid = $id")
                  ->getQuery();
$selected = $selQuery->getResult();



$form = $this ->createFormBuilder($product)
                ->add('extraspecs', 'entity', array(
                                'class' => 'LabsCatalogBundle:Specs',
                                'choices' => $typeavailable,
                                'data' => $selected,
                                'property' => 'specid',
                                'multiple' => false,
                            ))
                ->getForm();

А это var_dump из переменных $selected и $typeavailable:

$typeavailable:    
array (size=4)
      0 => 
        array (size=4)
          'specid' => int 20
          'desc' => string 'Primary Antibodies' (length=18)
          'cat' => int 0
          'type' => int 1
      1 => 
        array (size=4)
          'specid' => int 21
          'desc' => string 'Secondary Antibodies' (length=20)
          'cat' => int 0
          'type' => int 2
      2 => 
        array (size=4)
          'specid' => int 22
          'desc' => string 'Fluorescent-Labeled Antibodies' (length=30)
          'cat' => int 0
          'type' => int 5
      3 => &
        array (size=4)
          'specid' => int 27
          'desc' => string 'Related Antibodies' (length=18)
          'cat' => int 0
          'type' => int 7

$selected:
    array (size=1)
      0 => &
        array (size=4)
          'regmatid' => int 1600
          'specid' => int 21
          'attrib' => null
          'value' => null

Вы видите что-то не так? Потому что он генерирует выпадающий список, но не выбирает «выбранное» значение.


person Adriano Pedro    schedule 12.11.2012    source источник
comment
Я могу ошибаться, но я почти уверен, что элемент массива, который вы помещаете в атрибут «данные», должен точно соответствовать одному из элементов в вариантах. Похоже, что ваш не делает этого, только разделяя одно свойство.   -  person noShowP    schedule 12.11.2012
comment
Вы уверены, что?   -  person Adriano Pedro    schedule 12.11.2012
comment
Совершенно уверен, что вы можете проверить это, жестко закодировав свой $selected в массив ('specid' => 27, 'desc' => 'Related Antibodies', 'cat' => 0, 'type' => 7) и посмотреть, будет ли это отображается выбранным? А затем немного изменить его и посмотреть, не будет ли он больше выбран?   -  person noShowP    schedule 12.11.2012
comment
Я спрашивал об этом, потому что я сделал точно такой же тест, но он не работает ... все еще нет выбора ... И я не знаю, что делать дальше ...   -  person Adriano Pedro    schedule 12.11.2012
comment
Можете ли вы показать код, в котором вы определили $typeavailable и $selected.   -  person Mats Rietdijk    schedule 12.11.2012
comment
Конечно... Я отредактировал вопрос, включив в него код. Спасибо.   -  person Adriano Pedro    schedule 12.11.2012
comment
Последний вопрос: имеет ли объект ProductExtraspecs отношение один к одному к объекту Specs? Если нет, то какие у них отношения.   -  person Mats Rietdijk    schedule 12.11.2012
comment
Нет... это manyToOne... ProductExtraspecs может иметь несколько спецификаций, но спецификации уникальны. Эта таблица ProductsExtraspecs является промежуточной таблицей между Product и Specs, где каждая строка имеет один идентификатор продукта и один идентификатор спецификации, но каждый продукт может иметь несколько идентификаторов спецификаций. Вам нужна дополнительная информация?   -  person Adriano Pedro    schedule 12.11.2012
comment
Итак, $selected->getSpecs(); вернет более 1 объекта?   -  person Mats Rietdijk    schedule 12.11.2012
comment
Он может вернуть более 1 объекта... но поскольку я создаю фильтр только для кота = 0, он даст только 1... но да... он может вернуть больше (разного кота)..   -  person Adriano Pedro    schedule 12.11.2012
comment
Добавлен ответ, который немного объясняет это и предлагает, что вы могли бы сделать. Скажи мне, если это сработало.   -  person Mats Rietdijk    schedule 12.11.2012


Ответы (1)


Объекты, присвоенные индексу 'choices' ($typeavailable), должны относиться к тому же классу, что и ОДИН объект, присвоенный индексу 'data'. В данный момент вы возвращаете array не тот объект. Почему один объект? Поскольку ваша форма поддерживает только 1 выбранный элемент ('multiple' => false,).

Используйте это, чтобы решить проблему:

$result = $selQuery->getSingleResult()->getSpecs();
$selected = $result[0];

Этот фрагмент кода должен дать вам объект Specs, который вы хотите выбрать.

Если ваш запрос на выборку также возвращает более 1 объекта, возможно, вы захотите что-то изменить в своих отношениях или запросе. Если вы не хотите этого делать, вы все равно можете использовать следующее:

$results = $selQuery->getResult();
$result = $results[0]->getSpecs();
$selected = $result[0];
person Mats Rietdijk    schedule 12.11.2012
comment
getSpecs()[0] подходит для PHP 5.5, нет? Или PHP 5.4 в порядке? - person j0k; 12.11.2012
comment
Нет... все еще не работает... Пошел проверить сгенерированный HTML и обнаружил, что значения в параметрах равны 0,1,2,3 вместо 20,21,22,27, которые должны быть в $доступные варианты... это нормально? - person Adriano Pedro; 12.11.2012
comment
Нет, это не так. Значение должно быть id объекта. Что возвращает $selected->getId()? - person Mats Rietdijk; 12.11.2012
comment
$selected ->getSpecid() дает значение от 20 до 22 или 27 в зависимости от продукта... все в порядке... и на самом деле теперь все работает отлично... он выбирает... но значение в опциях по-прежнему равно 0 ,1,2 и 3. Я думаю, что происходит то, что он сравнивает объекты, а не идентификаторы... Я просто надеюсь, что у меня не будет проблем с сохранением выбранной информации в базе данных... В любом случае, большое спасибо за все ... Я почти отказался от Symfony... - person Adriano Pedro; 12.11.2012