単一のパラメーターに基づく検索:
私はそれが行くべきだと思います:
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();