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值。