Forms 带参数的Symfony表单查询生成器

Forms 带参数的Symfony表单查询生成器,forms,symfony,doctrine,Forms,Symfony,Doctrine,我需要创建一个包含分组数据的下拉字段: 我的表格: class RetailerDetailFilterType extends AbstractType { public function getActiveRetailerMetrics(): array { return range(25,36); } public function buildForm(FormBuilderInterface $builder, array $option

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

我的表格:

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 

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

似乎
metric\u id
实际上是对某种度量实体的引用,仅仅传递一个int数组而不是实际对象似乎会使Doctrine的QueryBuilder出错

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


另一个解决方案——我更喜欢的解决方案——就是用于此。

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

似乎
metric\u id
实际上是对某种度量实体的引用,仅仅传递一个int数组而不是实际对象似乎会使Doctrine的QueryBuilder出错

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


另一个解决方案——我更喜欢的解决方案——就是使用它。

您的querybuilder返回的不仅仅是一个实体(dyear、dmonth),我认为FormType无法处理这个问题。尝试用以下方法替换select调用:
select('d,年(d.date)作为隐藏日期,月(d.date)作为隐藏月份)
。当然,这假设除了groupBy之外,您实际上不需要其他任何地方的dmonth和dyear值。您的querybuilder返回的不仅仅是一个实体(dyear,dmonth),我认为FormType无法处理这一点。尝试用以下方法替换select调用:
select('d,年(d.date)作为隐藏日期,月(d.date)作为隐藏月份)
。当然,这假设您实际上不需要除groupBy之外的任何其他地方的dmonth和dyear值。