2016-11-09 2 views
0

На моей сущности У меня есть коллекция массива пользователейучения QueryBuilder где В коллекции

/** 
* @ORM\ManyToMany(targetEntity="\UserBundle\Entity\User", mappedBy="acr_groups") 
*/ 
protected $users; 

public function __construct() { 
    $this->users = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

В моей FormType я хочу, чтобы отфильтровать те группы, в которых текущий пользователь является членом:

$builder 
    ->add('acr_group', EntityType::class, array(
     'label' => 'ATS', 
     'class' => 'HazardlogBundle:ACRGroup', 
     'query_builder' => function (EntityRepository $er) use ($user) { // 3. use the user variable in the querybilder 
       $qb = $er->createQueryBuilder('g'); 
       $qb->where(':user IN (g.users)'); 
       $qb->setParameters(array('user' => $user)); 
       $qb->orderBy('g.name', 'ASC'); 
       return $qb; 
     }, 
     'choice_label' => 'name' 
    )) 

Моего проблема, очевидно, в этой строке:

$qb->where(':user IN (g.users)'); 

Как использовать мою коллекцию пользователей в качестве аргумента для В()?

+0

Hello! Можете ли вы попытаться использовать выражение 'in' следующим образом:' $ qb-> где ($ qb-> expr() -> in ('g.users', $ user)); –

ответ

0

В результате я немного пошатнулся, пытаясь решить некоторые из ваших решений. Я вручную создал массив идентификаторов, которые я хотел.

Существует, вероятно, родной способ сделать это, похоже, довольно стандартная вещь ... это работает.

// 1. to inject user entity into this builder first make a construct function (remember to inject it from controller!) 

function __construct($user) 
{ 
    $this->user = $user; 
} 

/** 
* {@inheritdoc} 
*/ 


public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $user = $this->user; // 2. instantiate the variable we created in our construct above 

    //create group list array 
    $groupList = $this->user->getACRGroups(); 
    $gla = array(); 
    foreach ($groupList as $g) { 
     $gla[] = $g->getId(); 
    }; 

    $builder 
    ->add('acr_group', EntityType::class, array(
     'label' => 'ATS', 
     'class' => 'HazardlogBundle:ACRGroup', 
     'query_builder' => function (EntityRepository $er) use ($gla) { // 3. use the user variable in the querybilder 
       $qb = $er->createQueryBuilder('g'); 
       $qb->where('g.id IN (:gla)'); 
       $qb->setParameters(array('gla' => $gla)); 
       $qb->orderBy('g.name', 'ASC'); 
       return $qb; 
     }, 
     'choice_label' => 'name' 
    )) 
0
$q = $this->createQueryBuilder('v') 
    ->select('v') 
    ->andWhere('v.workingHours IN (:workingHours)') 
    ->setParameter('workingHours', $workingHours); 

От: Doctrine 2 WHERE IN clause using a collection of entities

Или в соответствии с доктриной документации: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/query-builder.html#the-expr-class включить в условия в построитель запросов с доктриной вы можете использовать выраж()

$qb->add('select', new Expr\Select(array('u'))) 
    ->add('from', new Expr\From('User', 'u')) 
    ->add('where', $qb->expr()->orX(
     $qb->expr()->eq('u.id', '?1'), 
     $qb->expr()->like('u.nickname', '?2') 
    )) 
    ->add('orderBy', new Expr\OrderBy('u.name', 'ASC')); 

Syntaxe ИН:

$qb->expr()->in('u.id', array(1, 2, 3)) 

Кроме того, Mak убедитесь, что вы НЕ используете что-то похожее на $qb->expr()->in('value', array('stringvalue')), так как это приведет к тому, что Doctrine выкинет исключение. Вместо этого используйте $qb->expr()->in('value', array('?1')) и связать свой параметр в? 1

1

Try ниже код

$user = array(12,211,612,84,63,23); // Assuming User Ids whose groups you want to retrive 

$builder 
->add('acr_group', EntityType::class, array(
    'label' => 'ATS', 
    'class' => 'HazardlogBundle:ACRGroup', 
    'query_builder' => function (EntityRepository $er) use ($user) { 
      $qb = $er->createQueryBuilder('g'); 
      $qb->innerJoin('g.users', 'u'); // Inner Join with users 
      $qb->where('u.id IN (:user)'); 
      $qb->setParameters(array('user' => $user)); 
      $qb->orderBy('g.name', 'ASC'); 
      return $qb; 
    }, 
    'choice_label' => 'name' 
)) 

Я попробовал его в symfony 2.3 с doctrine2. Вы можете использовать функцию select с createQueryBuilder(), чтобы получить конкретные столбцы.

Смежные вопросы