PHPWales 2020 - June 3rd to June 4th

SQLite3::createAggregate

(PHP 5 >= 5.3.0, PHP 7)

SQLite3::createAggregateSQL の集約関数として使用する PHP 関数を登録する

説明

public SQLite3::createAggregate ( string $name , mixed $step_callback , mixed $final_callback [, int $argument_count = -1 ] ) : bool

SQL の集約関数として使用する PHP 関数を登録します。 これは SQL 文の中で使用されるものです。

パラメータ

name

作成あるいは再定義したい SQL 集約関数の名前。

step_callback

集約対象のすべての項目に適用するコールバックとして指定する、 PHP の関数あるいはユーザー定義関数の名前。

final_callback

集約処理の最後に適用するコールバックとして指定する、 PHP の関数あるいはユーザー定義関数の名前。

argument_count

SQL 集約関数が受け取るパラメータの数。 負の値を指定すると、SQL 集約関数は任意の数の引数を受け取るようになります。

返り値

集約関数の作成に成功した場合に TRUE、失敗した場合に FALSE を返します

add a note add a note

User Contributed Notes 2 notes

up
3
boris dot dd at gmail dot com
2 years ago
<?php
class Test extends SQLite3
{
    public function
__construct($file)
    {
       
parent::__construct($file);
       
$this->createAggregate('groupConcat', [$this, 'concatStep'], [$this, 'concatFinal']);
    }
    public function
concatStep(&$context, $rowId, $string, $delimiter)
    {
        if (!isset(
$context)) {
           
$context = [
               
'delimiter' => $delimiter,
               
'data'      => []
            ];
        }
       
$context['data'][] = $string;
        return
$context;
    }
    public function
concatFinal(&$context)
    {
        return
implode($context['delimiter'], $context['data']);
    }
}
$SQLite = new Test('/tmp/test.sqlite');
$SQLite->exec("create table `test` (`id` TEXT, `color` TEXT, `size` TEXT)");
$SQLite->exec("insert into `test` (`id`, `color`, `size`) values ('1', 'red', 'M')");
$SQLite->exec("insert into `test` (`id`, `color`, `size`) values ('1', 'green', 'M')");
$SQLite->exec("insert into `test` (`id`, `color`, `size`) values ('1', 'blue', 'S')");
$Result = $SQLite->query("select `size`, groupConcat(`color`, ';') as `color` from `test` group by `size`");
while (
$row = $Result->fetchArray(SQLITE3_ASSOC)) {
   
print_r($row);
}
/*
Array
(
    [size] => M
    [color] => red;green
)
Array
(
    [size] => S
    [color] => blue
)
*/
up
-3
sukmaagungsaputra at gmail dot com
4 years ago
Lacks of example, right?
Let's try to give to SQlite3 the capability like ones of MySQL's
- REGEXP operator,
- MD5 function, and
- GROUP_CONCAT aggregate function

$db = new SQLite3($filename);
$db->createFunction('regexp', function ($a,$b) { return preg_match("/$a/i", $b); });
$db->createFunction('md5', function ($a) { return md5($a); });
$db->createAggregate ('group_concat',
            function(&$context, $rownumber, $str) { $context[]=$str; return $context; },
            function(&$context) {return implode(",", (array) $context); });
To Top