Symfony2 notIn不起作用

时间:2014-07-25 09:02:03

标签: php forms symfony doctrine-orm

我正在尝试使用带有notIn子句的query_builder。但它没有用,我有这个错误信息:

Call to a member function expr() on a non-object in C:\wamp\www\projet\src\Intranet\UserBundle\Entity\UserRepository.php line 301

这是方法:

    public function employesSansCongesAllouesEn($annee) {
    $nots = $this->createQueryBuilder('u') // récupérer les employés qui ont déjà des congés définis
            ->select('u.id')
            ->Join('\Intranet\CalendrierBundle\Entity\UserCongeByYear', 'uc', "WITH", "uc.user = u.id ") // jointure UserCongeByYear
            ->andWhere('u.enabled = 1 ')
            ->andWhere('uc.annee = :annee ') // condition d'année
            ->getDQL()
    ;
    $qb = $this->createQueryBuilder('user') // récupérer les employés qui n'ont pas encore de congé pour l'année choisie
            ->andWhere('user.enabled = 1')
            ->distinct('user')
            ->andWhere($qb->expr()->notIn('user.id', $nots)) // condition NOT IN
            ->setParameter(':annee', $annee)
            ->orderBy('user.nom', 'ASC')
    ;
    return $qb;
}

使用此查询的表单:

    public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
            ->add('users', 'entity', array(
                'label' => "Employés : ",
                'class' => 'IntranetUserBundle:User',
                'multiple' => false,
                'required' => true,
                'attr' => array('class' => 'form-control'),
                'query_builder' => function(UserRepository $er) use($options) {
            return $er->employesSansCongesAllouesEn($options['annee']);
        }
            ))
            ->add('heures', 'integer', array(
                'label' => "Nombre d'heures attribuées : ",
                'attr' => array('class' => 'form-control', 'min' => 1, 'max' => '250')
            ))
    ;
}

1 个答案:

答案 0 :(得分:3)

您在宣布之前使用$qb

您应该声明它,然后在查询构建过程中使用它,比如..

$qb = $this->createQueryBuilder();

// récupérer les employés qui ont déjà des congés définis
$nots = $qb
    ->select('u.id')
    ->Join(
        '\Intranet\CalendrierBundle\Entity\UserCongeByYear', 
        'uc', 
        "WITH", 
        "uc.user = u.id "
    ) // jointure UserCongeByYear
    ->andWhere('u.enabled = 1 ')
    ->andWhere('uc.annee = :annee ') // condition d'année
    ->getDQL()
;

// récupérer les employés qui n'ont pas encore de congé pour l'année choisie
return $qb
    ->where('user.enabled = 1')
    ->distinct('user')
    ->andWhere($qb->expr()->notIn('user.id', $nots)) // condition NOT IN
    ->setParameter(':annee', $annee)
    ->orderBy('user.nom', 'ASC')
;