2012-05-14 6 views
5

私はDoctrineのQueryBuilder APIに依存してDQL文を生成する次のコードを持っています。Doctrine QueryBuilderとconcatの問題

class PlayerRepository extends EntityRepository 
{ 
    public function findByPartialNameMatch($trainer, $fullName) 
    { 
     $qb = $this->createQueryBuilder('tp'); 

     $qb->innerJoin('tp.player', 'p') 
      ->where($qb->expr()->andX(
        $qb->expr()->orX(
         $qb->expr()->like(
          $qb->expr()->concat('p.firstName', $qb->expr()->concat(' ', 'p.lastName')), 
          $qb->expr()->literal($fullName.'%') 
         ), 
         $qb->expr()->like(
          $qb->expr()->concat('p.lastName', $qb->expr()->concat(' ', 'p.firstName')), 
          $qb->expr()->literal($fullName.'%') 
         ) 
        ), 
        $qb->expr()->eq('tp.trainer', '?1') 
       ) 
      ) 
     ->groupBy('p.id') 
     ->orderBy('p.lastName', 'ASC') 
     ->orderBy('p.firstName', 'ASC') 
     ->setParameter(1, $trainer); 

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

}

私はそれを実行し、Symfony2のは、次のエラーメッセージがスローされます。

at QueryException ::syntaxError ('line 0, col 123: Error: Expected StateFieldPathExpression | string | InputParameter | FunctionsReturningStrings | AggregateExpression, got ','') 
in D:\Work\vendor\doctrine\lib\Doctrine\ORM\Query\Parser.php at line 396 -+ 
at Parser ->syntaxError ('StateFieldPathExpression | string | InputParameter | FunctionsReturningStrings | AggregateExpression') 
in D:\Work\vendor\doctrine\lib\Doctrine\ORM\Query\Parser.php at line 2391 -+ 
at Parser ->StringPrimary() 
in D:\Work\vendor\doctrine\lib\Doctrine\ORM\Query\AST\Functions\ConcatFunction.php at line 60 -+ 
at ConcatFunction ->parse (object(Parser)) 
in D:\Work\vendor\doctrine\lib\Doctrine\ORM\Query\Parser.php at line 2852 - 

から:

[Syntax Error] line 0, col 123: Error: Expected StateFieldPathExpression | string |  InputParameter | FunctionsReturningStrings | AggregateExpression, got ',' 

スタックトレースを見ては、次のことを明らかにし上記のように、私はこの問題が何らかの形でconcatヘルパー関数に関係していることを理解しており、関数expec列挙された入力ですが、どういうわけか(?)はカンマ(、)を受け取りました。

上記のコードで何が問題になっていますか?検索に何時間も費やさなければ問題は解決されませんでした。

ありがとうございました!

答えて

24

問題は、この部分についてです:あなたは教義としてスペースを置くことができない

$qb->expr()->concat(' ', 'p.lastName') 

はここにいくつかのidentificatorを期待しています。代わりにこれを試してみてください:

$qb->expr()->concat($qb->expr()->literal(' '), 'p.lastName') 
+1

実際にそれが働きました。 [Doctrineのドキュメント](http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/query-builder.html#the-expr-class)を参照してください。これは不正確です。 –

2

私は、連結コードを共有したいと思います:

// It is easy to use array to project concat result. It will look like 'Diego Maradona Maradona Diego' 
$concatFields = array(
    'p.firstName', 
    'p.lastName', 
    'p.lastName', 
    'p.firstName', 
); 

// Routine code. All fields will be separated by ' '. 
foreach ($concatFields as $field) { 
    if (!isset($searchIn)) { 
     $searchIn = $qb->expr()->concat($qb->expr()->literal(''), $field); 
     continue; 
    } 

    $searchIn = $qb->expr()->concat(
     $searchIn, 
     $qb->expr()->concat($qb->expr()->literal(' '), $field) 
    ); 
} 

// Just use concat result to search in. 
$anyKeyword = 'ego'; 
$qb->add('where', $qb->expr()->like($searchIn, ':keyword')); 
$qb->setParameter('keyword', '%'. $anyKeyword .'%');