Symfony表单查询生成器

时间:2019-05-08 12:13:14

标签: symfony symfony-forms query-builder

我的查询生成器有问题,但我不知道该如何解决此错误,请您帮忙?

这是我的问题,我想检索不在调查表中且主题与调查表相同的问题列表。

这是我的代码:

    $builder
        ->add('orderQuestion')
        ->add('idQuestion', EntityType::class, [
            'class' => Question::class,
            'query_builder' => function(EntityRepository $er) use ($idTheme, $idQuestionnaire){
                $resultatQuestion = $er->createQueryBuilder('questionn')
                    ->select('questionn.id')
                    ->innerJoin('App\Entity\SurveyQuestion', 'surveyQuestion', 'WITH', 'questionn.id = surveyQuestion.idQuestion')
                    ->where('surveyQuestion.idSurvey = :idSurvey')
                ;

                $resultat = $er->createQueryBuilder('q')
                    ->leftJoin('q.surveyQuestions', 'sQ')
                    ->leftJoin('sQ.idSurvey', 's')
                    ->where('q.idTheme = :idTheme')->setParameter('idTheme', $idTheme)->setParameter(':idSurvey', $idQuestionnaire)
                    ->andWhere($er->createQueryBuilder('question')->expr()->notIn('q.id', $resultatQuestion->getDQL()))
                    ;

                return $resultat;
            },
            'choice_label' => function ($question) {
                return $question->getLabel();
            },
        ])
    ;

但是,使用此代码,将出现以下错误:“警告:get_class()期望参数1为对象,给定数组”。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:-1)

因此,很明显,正如我在评论中和Symfony's documentation-'query_builder'中所提到的,可以是QueryBuilder对象,可调用对象或null。 / p>

通过这种方式,您需要从第二个查询中删除->getQuery()->getResult()

更新

因此,感谢@msg在评论中的澄清。根据它,您还需要从第一条语句->getQuery()->getResult()中删除,只需在其中添加->getDQL()

它应该可以工作。

答案 1 :(得分:-1)

您可以修改代码

$resultat = $er->createQueryBuilder('q')
                    ->leftJoin('q.surveyQuestions', 'sQ')
                    ->leftJoin('sQ.idSurvey', 's')
                    ->where('q.idTheme = :val')
                    ->andWhere('q.id NOT IN ' . $test)
                    ->setParameter('val', $idTheme)
                    ->getQuery()
                    ->getResult()
                    ;