1

1 つの Doctrine 2 クエリで LIKE ワイルドカードを使用して一致させたい用語の配列があります。データベースは SQL で、私は DQL を使用していますが、クエリ ビルダー ソリューションで問題ありません。私の現在のクエリ設定は次のとおりです。

foreach($textterms as $text)
{
$parameters[] = '%-'.$text.'-%';
}

$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
'SELECT p FROM Post p WHERE p.searchfield IN LIKE (:text) ORDER BY p.datetime DESC'
        )->setParameter('text', $parameters);
        $posts = $query->getResult();

しかし、symfony エラー "QueryException: [Syntax Error] line 0, col 62: Error: Expected Literal, got '('" が表示されます

このクエリは教義で可能ですか?

4

1 に答える 1

1

クエリがLIKEステートメントの後に値を期待しているため、このようなエラーが発生します。「INLIKE」のようなものはありません。私が検討する可能性のある解決策:

// Query Builder added to show difference in code readability I personally use queryBuilder mostly
$query = $this->getDoctrine()->getManager()->createQueryBuilder();
$query->select('p')
        ->from('Post', 'p')
        ->orderBy('p.datetime', 'DESC');
$i = 0;
$parameters = array();
foreach ($textterms as $key => $text)
{
    $query->orWhere('p.searchfield LIKE ?' . $i++);
    $parameters[] = '%-' . $text . '-%';
}
$query->setParameters($parameters);
$posts = $query->getQuery()->getResult();

// Query
$orX = new \Doctrine\ORM\Query\Expr\Orx();
$i = 0;
$parameters = array();
foreach ($textterms as $text)
{
    $orX->add('p.searchfield LIKE ?' . $i++);
    $parameters[] = '%-' . $text . '-%';
}
$orX = (string)$orX;
if(!empty($orX))
{
    $orX = 'WHERE ' . $orX;
}
$sql = sprintf('SELECT p FROM Post p %s ORDER BY p.datetime DESC', $orX);
$query = $this->getDoctrine()->getManager()->createQuery($sql);
$query->setParameters($parameters);
$posts = $query->getResult();
于 2012-10-25T19:32:51.583 に答える