带参数的Symfony Form Querybuilder

时间:2017-04-17 01:48:22

标签: forms symfony doctrine

我需要创建一个包含分组数据的下拉字段:

我的表格:

class RetailerDetailFilterType extends AbstractType
{
    public function getActiveRetailerMetrics(): array
    {
        return range(25,36);
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('month', EntityType::class,
            [
                'class' => 'AppBundle:ConsolidatedOperatorCategoryLowData',
                'query_builder' => function(ConsolidatedOperatorCategoryLowDataRepository $er){
                    return $er->getMinMaxByMetricQueryBuilder($this->getActiveRetailerMetrics());
                }
            ]);

    }


    public function getBlockPrefix()
    {
        return 'key_metric';
    }
}

我的存储库:

    class ConsolidatedOperatorCategoryLowDataRepository extends \Doctrine\ORM\EntityRepository
{
    public function getMinMaxByMetricQueryBuilder($metricRange)
    {
        $qb = $this->getEntityManager()
            ->createQueryBuilder('d');
        $qb
            ->select('d.id, YEAR(d.date) as dyear, MONTH(d.date) as dmonth')
            ->from('AppBundle:ConsolidatedOperatorCategoryLowData','d')
            ->where($qb->expr()->in('d.metric_id', $metricRange))
            ->groupBy('dyear')
            ->addGroupBy('dmonth')
            ->setMaxResults(10)
            ;
        return $qb;

    }

我正在

Warning: spl_object_hash() expects parameter 1 to be object, integer given


at UnitOfWork ->isScheduledForInsert (3182005) 
in vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php at line 710       + 
at EntityManager ->contains (3182005) 
in     vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Form/ChoiceList/IdReader.php at line 116   + 
at IdReader ->getIdValue (3182005) 
at call_user_func (array(object(IdReader), 'getIdValue'), 3182005) 
in     vendor/symfony/symfony/src/Symfony/Component/Form/ChoiceList/ArrayChoiceList.php at line 205   + 
at ArrayChoiceList ->flatten (array('id' => 3182005, 'dyear' => '2016', 'dmonth' => '12'), array(object(IdReader), 'getIdValue'), array(), array(), null) 
in     vendor/symfony/symfony/src/Symfony/Component/Form/ChoiceList/ArrayChoiceList.php at line 200   + 
at ArrayChoiceList ->flatten (array(array('id' => 3182005, 'dyear' => '2016', 'dmonth' => '12'), array('id' => 3186685, 'dyear' => '2017', 'dmonth' => '1'), array('id' => 3191365, 'dyear' => '2017', 'dmonth' => '2'), array('id' => 3195595, 'dyear' => '2017', 'dmonth' => '3'), array('id' => 3200275, 'dyear' => '2017', 'dmonth' => '4')), array(object(IdReader), 'getIdValue'), array(), array(), array(null)) 
in    vendor/symfony/symfony/src/Symfony/Component/Form/ChoiceList/ArrayChoiceList.php at line 91 

1 个答案:

答案 0 :(得分:0)

我认为这与Doctrine ORM如何处理关系有关。当您想要通过引用对象的id检索实体时,比如按用户ID查找所有帖子,那么您仍然必须将User-object传递给QueryBuilder,而不仅仅是id。这是因为Doctrine将解决这些实体自身连接的方式。

似乎metric_id实际上是对某种Metric实体的引用,只是传递一个int数组而不是实际的对象似乎绊倒了Doctrine的QueryBuilder。

您可以尝试将id映射到新的Metric实例,然后再传递该数组。

另一种解决方案 - 我更喜欢的解决方案 - 就是使用Native SQL