2017-07-27 108 views
2

我有以下Phql查询:如何在phalcon php phql中连接字符串?

$persons = Person::query() 
     ->columns([ 
      'id' => 'id', 
      'name' => 'first_name || last_name' 
     ]) 
     ->where("first_name LIKE :searchQuery:") 
     ->orWhere("last_name LIKE :searchQuery:") 
     ->bind(['searchQuery' => $searchQuery . '%']) 
     ->execute(); 

使用的数据库是一个的SQLite数据库

的查询工作正常,直到我包括sqlite的||

连接操作

引发的异常是:

Scanner: Unknown opcode 402

我已经试过CONCAT(first_name, last_name),但它引发异常:

SQLSTATE[HY000]: General error: 1 no such function: CONCAT

回答

2

而且更好是使用方言扩展:

namespace App/Dialect; 

class Sqlite extends \Phalcon\Db\Dialect\Sqlite 
{ 
    /** 
    * Sqlite constructor. 
    */ 
    public function __construct() 
    { 
     $this->registerCustomFunctions(); 
    } 

    /** 
    * Register Custom dialect functions 
    */ 
    public function registerCustomFunctions() 
    { 
     $customFunctions = [ 
      'CONCAT_WS' => 'ConcatWs', 
     ]; 
     foreach ($customFunctions as $key => $value) { 
      $className = 'App\\Dialect\\Extensions\\'.$value; 
      $object = new $className; 
      $this->registerCustomFunction($key, $object->getFunction()); 
     } 
    } 
} 

namespace App/Dialect/Extensions; 

class ConcatWs 
{ 
    public function getFunction() 
    { 
     return function (Dialect $dialect, $expression) { 
      $sql = ''; 


      $count = count($expression['arguments']); 

      if (true !== $count >= 2) { 
       throw new Exception('CONCAT_WS requires 2 or more parameters'); 
      } 

      if (2 === $count) { 
       return $this->getSqlExpression($expression['arguments'][1]); 
      } 

      $separator = array_shift($expression['arguments']); 

      --$count; 
      foreach ($expression['arguments'] as $argument) { 
       $sql .= $this->getSqlExpression($argument); 
       if (0 !== --$count) { 
        $sql .= ' || '.$this->getSqlExpression($separator).' || '; 
       } 
      } 

      return $sql; 
     }; 
    } 
} 

然后在你的数据库服务:

use App/Dialect/Sqlite as SqliteDialect; 

$di->set('db', function() { 
    return new Sqlite([ 
     // other options, like password etc 
     'dialectClass' => SqliteDialect::class 
    ]); 
}); 
0

不幸的是,这不支持sqllite,但你可以扩展类和添加对MySQL concat函数的支持。这里是一个有效的解决方案:https://forum.phalconphp.com/discussion/15233/concatenate-columns-using-sqlite

MySQL的解决方案:

->columns([ 
    'id', 
    'CONCAT_WS("@", id, created_at) AS concatenatedValue', 
]) 

结果

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [concatenatedValue] => [email protected] 12:08:52 
+0

这是用于sqlite吗?它没有异常工作:SQLSTATE [HY000]:一般错误:1没有这样的函数:CONCAT_WS – yogur

+0

哦,真的很抱歉,错过了sqlite部分。这是mysql。你可以尝试'(first_name || last_name)AS con con ...'?我现在检查sqlite解决方案:) –

+0

谢谢。按照您的建议,用括号试用。仍然说'扫描仪:未知的操作码402' – yogur