Laravel ClickHouse — це драйвер бази даних, який інтегрує ClickHouse із Laravel, додаючи підтримку Eloquent, Query Builder, Schema Builder та інших інструментів:
- Моделі Eloquent із підтримкою неінкрементних ID;
- Query Builder зі специфічними конструкціями ClickHouse (як-от
FINAL,ARRAY JOIN,SAMPLE); - Schema Builder із підтримкою
ENGINE,PARTITION BY,ORDER BYта типів колонокLowCardinality; - Керування міграціями через стандартну команду
artisan migrate; - Паралельне виконання запитів через асинхронний HTTP-пул Guzzle;
- Два варіанти HTTP-транспорту: Guzzle та Curl/phpclickhouse.
ClickHouse — це колоночна СУБД із відкритим кодом для аналітичних навантажень. Вона зберігає дані за колонками, а не за рядками, що дозволяє миттєво агрегувати величезні масиви даних і опрацьовувати мільярди рядків за лічені секунди. Це оптимальний вибір для трекінгу подій, роботи з часовими рядами (time-series) та створення аналітичних панелей, де швидкість читання на великих масштабах є критичною.
# Моделі Eloquent
Ви можете визначати моделі Eloquent для ClickHouse так само, як і для будь-якої іншої бази даних:
class Event extends Model
{
protected $connection = 'clickhouse';
}
$events = Event::where('user_id', 1)->get();
Оскільки ClickHouse не підтримує автоінкрементні первинні ключі, драйвер автоматично налаштовує моделі на роботу з неінкрементними ID. Scopes та колекції працюють без змін.
# Query Builder та розширення ClickHouse
Query Builder підтримує стандартні методи Laravel та додає специфічні функції для ClickHouse. Параметр final застосовує модифікатор FINAL, який змушує ClickHouse об'єднувати дублікати під час зчитування — це необхідно для двигуна ReplacingMergeTree:
$events = DB::connection('clickhouse')
->table('events', final: true)
->where('user_id', 1)
->get();
Також доступні розширення PREWHERE (фільтрація за колонками первинного ключа), ARRAY JOIN, SAMPLE, LIMIT BY та типи джоінів SEMI/ANTI/ASOF.
# Schema Builder та міграції
Schema Builder підтримує ClickHouse DDL через ClickHouseBlueprint. Ви можете визначати двигуни таблиць (engines), ключі секціонування (partition keys), ключі сортування (order keys) та спеціальні типи на кшталт LowCardinality:
Schema::connection('clickhouse')->create('events', function (ClickHouseBlueprint $table) {
$table->engine('MergeTree()');
$table->orderBy(['id', 'created_at']);
$table->partitionBy('toYYYYMM(created_at)');
});
Команди artisan migrate працюють зі спеціальним репозиторієм міграцій, що дозволяє керувати схемою ClickHouse разом з іншими базами даних.
# Паралельне виконання запитів
Пакет містить хелпер Parallel для одночасного запуску кількох запитів через асинхронний HTTP-пул Guzzle:
$results = Parallel::get([
'users' => User::where('active', 1),
'events' => Event::where('type', 'click'),
]);
Запити до таблиць users та events виконуються паралельно, а результати повертаються у вигляді масиву після завершення всіх операцій.
Повну документацію та вихідний код можна знайти на GitHub.