2012-05-14 22 views
5

Tôi có mã sau đây, dựa trên API QueryBuilder của Doctrine để tạo ra các số liệu thống kê DQL.Truy vấn về giáo lýCác vấn đề về dựng hình và 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(); 
} 

}

Khi tôi chạy nó, Symfony2 ném thông báo lỗi sau:

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

Một nhìn vào vết đống, tiết lộ như sau:

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 - 

Từ ở trên, tôi hiểu rằng vấn đề là bằng cách nào đó liên quan đến chức năng trợ giúp concat, và rằng các chức năng expec ts đầu vào được liệt kê nhưng bằng cách nào đó (?) đã nhận được dấu phẩy (,).

Điều gì sai với mã ở trên? Giờ tìm kiếm không thể làm sáng tỏ vấn đề.

Cảm ơn sự giúp đỡ của bạn!

Trả lời

24

Vấn đề là về phần này:

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

Bạn không thể chỉ cần đặt không gian như học thuyết hy vọng một số identificator đây. Hãy thử điều này thay vì:

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

Trên thực tế nó làm việc. [Tài liệu Doctrine] (http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/query-builder.html#the-expr-class), cung cấp một ví dụ về điều này, là không chính xác. –

2

Tôi muốn chia sẻ mã concat của tôi:

// 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 .'%');