11

私はDoctrineを初めて使用し、ステートメントに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;

having() 句を使用してステートメントを実行しようとすると、次のエラーが発生します: Expression of type 'Doctrine\ORM\QueryBuilder' not allowed in this context.

having() 句がなければ、すべてが完全に機能します。

これを解決する方法がわかりません。

4

3 に答える 3

17

HAVING 句には GROUP BY が必要です。教義では、次のようになります。

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

mysql を使用していると仮定すると、having 句のチュートリアルは次のとおりです: http://www.mysqltutorial.org/mysql-having.aspx

于 2013-08-24T01:14:15.073 に答える
1

目標: フィルター ダウン O2M 関係の多側で、フィルター処理するいくつかの既知の集計可能な条件 (たとえば、バンドル内のオリジナル パーツの数) がある場合、片側を他の側と共に制限したい選ぶ基準。

次に、LEFT_JOIN 操作の条件をいくつか追加します。条件 #1 - bundle.id == original_part.bundle ID。条件 #2 - original_part の partStatusType == 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));

行は、One (バンドル エンティティ) のエイリアスです。

于 2017-04-19T19:49:07.130 に答える