2017-04-17 7 views
0

私はグループ化されたデータで、ドロップダウンフィールドを作成する必要があります。symfonyのフォームQuerybuilder

マイ形式:

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 
+0

querybuilderはエンティティ(dyear、dmonth)以上のものを返しますが、FormTypeがそれを処理できるとは思いません。 'select( 'd、YEAR(d.date)AS HIDDEN dyear、MONTH(d.date)as HIDDEN dmonth')'を選択呼び出しに置き換えてみてください。これは、groupBy以外の場所では、実際にdmonthとdyearの値を必要としないことを前提としています。 – ccKep

答えて

0

だと思いますo Doctrine ORMが関係をどのように扱うのか。参照されたオブジェクトのIDでエンティティを取得する場合、ユーザーIDですべての投稿を検索すると、IDだけでなく、QueryBuilderにUserオブジェクトも渡す必要があります。これは、Doctrineがそれらのエンティティがどのように接続されているかを解決するためです。

metric_idは実際には何らかのMetricエンティティへの参照であり、実際のオブジェクトの代わりにintの配列を渡すだけで、DoctrineのQueryBuilderを上回っているようです。

idをMetricの新しいインスタンスにマップし、その配列を代わりに渡すことができます。

私が好む別の解決策は、これにNative SQLを使用することです。

関連する問題