3

私のリポジトリクラスでは、次のものを使用します。

public function getItemsByTag($tag)
{
    $qb = $this->createQueryBuilder('c')
               ->select('c')
               ->where('c.tags LIKE %bipolar%')
               ->addOrderBy('c.id');

    return $qb->getQuery()
              ->getResult();
}

しかし、残念ながらこれは機能しません。これがどのように機能するか知っている人はいますか?または、QueryBuilderなしでカスタムクエリを作成する必要がありますか?

ありがとう!

4

4 に答える 4

13

単一のパラメーターに基づく検索:

私はそれが行くべきだと思います:

public function getItemsByTag($tag)
{
    $qb = $this->createQueryBuilder('c')
           ->select('c')
           ->where('c.tags LIKE :tag')
           ->addOrderBy('c.id')
           ->setParameter('tag', $tag);

    return $qb->getQuery()->getResult();
}

ただし、クエリビルダーを使用する場所の一部としてLIKEを実行することはお勧めできないため、次のようにする必要があります。

$qb = $this->createQueryBuilder('c');

$qb->select('c')
   ->where($qb->expr()->like('c.tags', '?1'))
   ->addOrderBy('c.id')
   ->setParameter(1, $tag);

return $qb->getQuery()->getResult();

詳細については、ドキュメントを確認してください。ヘルパーメソッドというタイトルのセクションに同様の式の例があります。

また、各例でパラメーターをクエリに渡すために異なる規則を使用したことも指摘しておく必要があります。最初に使用された名前付きパラメーター:tagは、2番目に設定されたものでありsetParameter('tag', $value)、番号付きパラメーター?1です。同じように簡単に名前付きパラメーターを使用できます。必要に応じて、2番目の例のパラメーター。

パラメータの配列を使用した検索:

あなたはまた、いいねの配列をすることについて尋ねました。ここではOR式を使用していますが、すべてのタグを検索する場合は、ANDに変更できます。

「LIKE配列」を作成するには、式を独自に作成する必要があります。

$qb = $this->createQueryBuilder('c');

$orExpr = $qb->expr()->orX();

for ($i = 0; $i < count($tags); $i++) {
    $orExpr->add($qb->expr->like('c.tags', "?$i"));

    // You may have to set params later in a loop after $orExpr has been
    // added to the queryBuilder.
    $qb->setParameter($i, $tags[$i]);
}

$qb->select('c')->where($orExpr)->addOrderBy('c.id');

return $qb->getQuery()->getResult();
于 2011-11-28T00:06:23.773 に答える
3

クエリを変数に置き換えたくないが静的文字列を使用する場合は、文字列をアポストロフィに入れる必要があります。

引用符の代わりにアポストロフィを使用する必要があります。そうしないと、Doctrine2レクサーが例外をスローします。

したがって、あなたの場合、マイクは次のものを使用できます。

'c.tags LIKE \'%bipolar%\''

また

"c.tags like '%bipolar%'"
于 2012-06-12T09:25:51.000 に答える
1

私はSymfonyについてあまり知りませんが、PHPとMySQLについて知っていることに基づいて、あなたが意味していると思います'c.tags LIKE "%bipolar%"'。の前後に引用符が必要になる可能性があります%bipolar%

于 2011-11-27T23:47:12.190 に答える
0

単に:

public function getItemsByTag($tag)
{
    $qb = $this->createQueryBuilder('c')
           ->select('c')
           ->where( $qb->expr()->like('c.tags', ':tags') )
           ->addOrderBy('c.id');

    $qb->setParameter('tags', '%' . $tag . '%' );

    return $qb->getQuery()->getResult();
}
于 2021-05-31T11:17:36.640 に答える