smi2/phpclickhouse
PHP client for ClickHouse with an easy, fluent API. Supports queries and inserts, result sets, bindings, and connection configuration for fast analytics workflows. Suitable for Laravel and standalone PHP apps needing reliable ClickHouse access.
Two binding syntaxes are supported:
:paramName — replaced with escaped value{paramName} — replaced with raw value (use for table/column names)$date1 = new DateTime("now");
$bindings = [
'select_date' => ['2000-10-10', '2000-10-11', '2000-10-12'],
'datetime' => $date1,
'limit' => 5,
'from_table' => 'table',
];
$statement = $db->selectAsync(
"SELECT * FROM {from_table} WHERE datetime = :datetime LIMIT {limit}",
$bindings
);
Bindings are resolved iteratively:
$keys = [
'A' => '{B}',
'B' => ':C',
'C' => 123,
'Z' => [':C', ':B', ':C'],
];
$db->selectAsync('{A} :Z', $keys)->sql();
// Result: "123 ':C',':B',':C' FORMAT JSON"
Arrays are automatically expanded to comma-separated lists for use in IN clauses:
$db->select(
'SELECT * FROM table WHERE id IN (:ids)',
['ids' => [1, 2, 3]]
);
// WHERE id IN (1, 2, 3)
$whereIn = new ClickHouseDB\Query\WhereInFile();
$whereIn->attachFile(
'/tmp/temp_csv.txt',
'namex',
['site_id' => 'Int32', 'site_hash' => 'String'],
ClickHouseDB\Query\WhereInFile::FORMAT_CSV
);
$result = $db->select($sql, [], $whereIn);
See example/exam7_where_in.php.
Conditions must be explicitly enabled:
$db->enableQueryConditions();
$input_params = [
'select_date' => ['2000-10-10', '2000-10-11', '2000-10-12'],
'limit' => 5,
'from_table' => 'table',
];
$select = '
SELECT * FROM {from_table}
WHERE
{if select_date}
event_date IN (:select_date)
{else}
event_date = today()
{/if}
{if limit}
LIMIT {limit}
{/if}
';
$statement = $db->selectAsync($select, $input_params);
echo $statement->sql();
/*
SELECT * FROM table
WHERE event_date IN ('2000-10-10','2000-10-11','2000-10-12')
LIMIT 5
FORMAT JSON
*/
// With select_date = false:
/*
SELECT * FROM table
WHERE event_date = today()
LIMIT 5
FORMAT JSON
*/
$state1 = $db->selectAsync(
'SELECT 1 as {key} WHERE {key} = :value',
['key' => 'ping', 'value' => 1]
);
// SELECT 1 as ping WHERE ping = "1"
See example/exam16_custom_degeneration.php for implementing custom query transformations:
SELECT {ifint VAR} result_if_intval_NON_ZERO {/if}
SELECT {ifint VAR} result_if_intval_NON_ZERO {else} BLA BLA {/if}
How can I help you explore Laravel packages today?