我正在尝试使用带有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')
))
;
}
答案 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')
;