使用ChoiceList作为实体类型

时间:2014-10-09 07:07:55

标签: symfony symfony-forms

我尝试在具有实体类型的表单中使用选项列表,但是如果我向表单添加数据则它不起作用。它给了我一个"无法将对象转换为int"错误。

我的buildForm方法

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('department', 'entity', array(
            'label' => 'Form.department',
            'class' => 'HotfloSystemCoreBundle:Department',
            'choice_list' => $this->departmentChoiceList,
            'multiple' => true,
            'required' => false,
            'attr' => array(
                'class' => 'selectpicker',
                'data-actions-box' => true,
                'data-live-search' => true,
                'data-selected-text-format' => 'count'
            ),
            'horizontal' => false,
        ));
}

我的选择列表

class DepartmentChoiceList extends LazyChoiceList
{
    /**
     * @var EntityManager
     */
    protected $em;

    public function __construct($em)
    {
        $this->em = $em;
    }

    /**
     * Loads the choice list
     * Should be implemented by child classes.
     *
     * @return ChoiceListInterface The loaded choice list
     */
    protected function loadChoiceList()
    {
        $departments = $this->getDepartments();
        $departmentChoices = [];
        foreach ($departments as $department) {
            $departmentChoices[$department->getId()] = $department;
        }
        // Return the choice list
        return new SimpleChoiceList($departmentChoices);
    }

    /**
     * Get the departments available in the poli appointment data
     *
     * @return Department[]
     */
    protected function getDepartments()
    {
        // Get the used department out of the appointment table by using a group by SQL statement
        /** @var $qb QueryBuilder */
        $qb = $this->em->getRepository('MyBundle:PoliAnalyzeAppointment')
            ->createQueryBuilder('appointment');
        $qb->select('DISTINCT IDENTITY(appointment.department)');

        // Get the actual departments
        /** @var $qb2 QueryBuilder */
        $qb2 = $this->em->getRepository('MyBundle:Department')
            ->createQueryBuilder('department');
        $qb2->where($qb2->expr()->in('department.id', $qb->getDQL()));
        $qb2->orderBy('department.name', 'ASC');

        return $qb2->getQuery()->getResult();
    }
}

我使用实体类型,因为它应该转换为实体并返回。如果我使用选择类型,我必须自己做(我不想要)。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

使用query_builder选项过滤实体选择列表。类似的东西:

'query_builder' => function(EntityRepository $er) {
    return $er->createQueryBuilder('a')
        ->select(array('DISTINCT IDENTITY(a.department)', 'd'))
        ->from('MyBundle:PoliAnalyzeAppointment', 'a')
        ->innerJoin('a.department', 'd')
        ->groupBy('a.department')
        ->orderBy('d.name', 'ASC');
}

答案 1 :(得分:0)

在buildForm方法中,我会用标准选项数组填充它:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('department', 'entity', array(
        'label' => 'Form.department',
        'choice_list' => $options['departmentChoiceList'],
        'multiple' => true,
        'required' => false,
        'attr' => array(
            'class' => 'selectpicker',
            'data-actions-box' => true,
            'data-live-search' => true,
            'data-selected-text-format' => 'count'
        ),
        'horizontal' => false,
    ));
}

然后在同一个formType中添加另一个方法:

public function setDefaultOptions(OptionsResolverInterface $resolver) {
/*
 * Instantiate DepartmentChoiceList and 
 * Implement the logic to build your Array and then set it this way
 */
   $resolver->setDefaults(array(
   'departmentChoiceList' => $yourDepartamentChoiceArray,
   'data_class' => 'HotfloSystemCoreBundle:Department'
   ));

}

注意:我在这里也声明了整个表单的data_class,但如果需要,也可以将它从setDefaults中删除。 我建议看看the Entity type,这样你就不必使用Transformer将对象转换为int - > int to object for choice fields。