如何在phalcon php phql中连接字符串?

如何在phalcon php phql中连接字符串?,php,phalcon,Php,Phalcon,我有以下Phql查询: $persons = Person::query() ->columns([ 'id' => 'id', 'name' => 'first_name || last_name' ]) ->where("first_name LIKE :searchQuery:") ->orWhere("last_name LIKE :searchQ

我有以下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的连接操作符

引发的异常是:

扫描仪:未知操作码402

我尝试了
CONCAT(名字、姓氏)
,但它引发了异常:

SQLSTATE[HY000]:一般错误:1没有这样的函数:CONCAT


遗憾的是,sqllite不支持这一点,但您可以扩展该类并添加对MySQL concat函数的支持。以下是一个可行的解决方案:

MySQL解决方案:

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

Array
(
    [0] => Array
        (
            [id] => 1
            [concatenatedValue] => 1@2017-04-04 12:08:52

更好的方法是使用方言扩展:

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
    ]);
});

这是给sqlite的吗?它无法正常工作,异常:SQLSTATE[HY000]:一般错误:1没有这样的函数:CONCAT_WSOhhh,非常抱歉,错过了sqlite部分。这是mysql。你能试着把
(名字| |姓氏)作为con…
?我现在就检查sqlite解决方案:)谢谢。按照你的建议用括号试过了。还是说扫描仪:未知操作码402是的,你说得对。找到了sqllite的解决方案,您可以查看上面的链接。