2013-08-23 1 views
4

Я новичок в Доктрине, и я пытаюсь выяснить, как добавить предложение having в мой оператор. В основном я хочу, чтобы иметь возможность фильтровать на возвращенных элементах в зависимости от того, сколько атрибутов пользователь выбирает. Код выглядит следующим образом:Добавление предложения о заключении в доктрину

// create query builder 
    $qb = $this->getEntityManager()->createQueryBuilder(); 

    $qb->select('p') 
     ->from($this->_entityName, 'p') 
     ->leftJoin('p.options', 'o') 
     ->where('p.active = :active') 
     ->setParameter('active', 1); 

    // add filters 
    $qb->leftJoin('o.attributes', 'a'); 
       $ands = array(); 

       foreach ($value as $id => $values) 
       { echo count($values); 
        $ands[] = $qb->expr()->andX(
         $qb->expr()->eq('a.attribute_id', intval($id)), 
         $qb->expr()->in('a.attribute_value_id', array_map('intval', $values)) 
         $qb->having('COUNT(*)=3) // THIS DOESN'T WORK 
         //$qb->expr()->having('COUNT(*)=3) // THIS DOESN'T WORK EITHER 
        ); 
       } 

       $where = $qb->expr()->andX(); 


       foreach ($ands as $and) 
       { 
        $where->add($and); 
       } 
       $qb->andWhere($where); 
       $result = $qb->getQuery()->getResult(); 
       return $result; 

При попытке выполнить оператор с имея() п я получаю эту ошибку: Выражения типа «Учение \ ORM \ QueryBuilder» не имеет в этом контексте.

Без условия have() все работает отлично.

Я понятия не имею, как это решить.

+0

Только для ударов: $ qb-> having ('count (*) = 3'); Обратите внимание на пробелы вокруг =. Раньше была ошибка. Похоже, теперь это будет исправлено, но, возможно, нет. – Cerad

+0

Я по-прежнему получаю ту же ошибку, я также не нашел никакой информации об ошибке. Я даже не могу найти примеры того, как это используется. –

+0

Как я уже сказал, это старая ошибка. На самом деле не ожидал, что это сработает. Запрос, как опубликовано, слишком сложный для меня. Я бы предложил сделать простой DQL с предложением HAVING, а затем изучить сгенерированный sql и проверить работу запроса. Затем начните добавлять вещи. На простой вопрос с одним лайнером будет легче ответить. – Cerad

ответ

0

Может быть, вы должны связать номер 3 к параметру:

$qb->having('COUNT(*)=:some_count') 
$qb->setParameter('some_count',3) 
+0

Это был первый способ, который я пробовал, затем попробовал еще раз, и мне все равно не повезло, я получаю ту же ошибку –

7

HAVING Предложение требует GROUP BY. В учении было бы что-то подобное:

$qb->groupBy('p.id'); // or use an appropriate field 
$qb->having('COUNT(*) = :some_count'); 
$qb->setParameter('some_count', 3); 

Предполагая, что вы используете MySQL, здесь имеющий раздел учебника: http://www.mysqltutorial.org/mysql-having.aspx

0

Цель: фильтр вниз с одной стороны, где мы имеем некоторый известный суммируемых условия мы хотите отфильтровать (например, счет оригинальных частей в комплекте) на многих сторонах отношения O2M, где они хотят ограничить одну сторону, а также некоторые другие критерии для выбора.

Затем мы добавляем несколько условий для операции LEFT_JOIN: Условие №1 - идентификатор bundle.id == original_part.bundle ID. Условие № 2 - Часть оригинала_началаStatusType == 3 (некоторое жестко заданное значение).

Затем мы фильтруем до COUNT (op)> = 1, который дает наш более ограниченный ответ, который отлично работает с разбиением на страницы.

$qb->leftJoin(OriginalPart::class, 'op', Expr\Join::WITH, 
     $qb->expr()->andX(
      $qb->expr()->eq('op.bundle', 'row.id'), 
      $qb->expr()->eq('op.partStatusType', 3))); 
    $qb->groupBy('row.id'); 
    $qb->having($qb->expr()->gte('COUNT(op)', 1)); 

строка является псевдонимом для Единицы (связки).

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