2017-07-27 33 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; 
     }; 
    } 
} 

そして中あなたのdbサービス:

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 ...'を試すことができますか?今sqliteソリューションのために病気チェック: –

+0

ありがとう。あなたが提案したようにかっこで試してみました。 「スキャナー:不明なオペコード402」 – yogur