joaojkuligowski/laravel-fluent-clickhouse-driver 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

joaojkuligowski/laravel-fluent-clickhouse-driver

Composer 安装命令:

composer require joaojkuligowski/laravel-fluent-clickhouse-driver

包简介

Fluent Eloquent for ClickHouse

README 文档

README

Package proudly made in Brazil <3! English | Portuguese

Latest Version on Packagist Total Downloads

A fluent Eloquent driver for ClickHouse database integration with Laravel. This package allows you to use Laravel's Eloquent ORM with ClickHouse databases, providing a familiar and powerful interface for analytics and big data operations.

Features

  • 🚀 Full Laravel Eloquent ORM compatibility
  • 🔧 Fluent query builder support
  • 📊 Optimized for ClickHouse analytics operations
  • 🌐 HTTP and TCP connection modes
  • 🔒 Secure authentication support
  • ⚡ Asynchronous query support
  • 🧪 Comprehensive testing suite

Requirements

  • PHP ^8.2
  • Laravel ^12.0
  • ClickHouse Server

Installation

You can install the package via Composer:

composer require joaojkuligowski/laravel-fluent-clickhouse-driver

The package will automatically register its service providers through Laravel's auto-discovery feature.

Configuration

Database Configuration

Add a ClickHouse connection to your config/database.php file:

'connections' => [
    // ... your other database connections
    
    'clickhouse' => [
        'driver' => 'clickhouse',
        'host' => env('CLICKHOUSE_HOST', '127.0.0.1'),
        'port' => env('CLICKHOUSE_PORT', 8123),
        'database' => env('CLICKHOUSE_DATABASE', 'default'),
        'username' => env('CLICKHOUSE_USERNAME', 'default'),
        'password' => env('CLICKHOUSE_PASSWORD', ''),
        'https' => env('CLICKHOUSE_HTTPS', false),
        'mode' => env('CLICKHOUSE_MODE', 'tcp'), // 'tcp' or 'http'
        'readonly' => env('CLICKHOUSE_READONLY', false),
        'async' => env('CLICKHOUSE_ASYNC', false),
    ],
],

Environment Variables

Add these variables to your .env file:

CLICKHOUSE_HOST=127.0.0.1
CLICKHOUSE_PORT=8123
CLICKHOUSE_DATABASE=default
CLICKHOUSE_USERNAME=default
CLICKHOUSE_PASSWORD=
CLICKHOUSE_HTTPS=false
CLICKHOUSE_MODE=tcp
CLICKHOUSE_READONLY=false
CLICKHOUSE_ASYNC=false

Usage

Creating Models

Create ClickHouse models by extending the LaravelClickhouseModel:

<?php

namespace App\Models;

use JoaoJ\LaravelClickhouse\LaravelClickhouseModel;

class AnalyticsEvent extends LaravelClickhouseModel
{
    protected $connection = 'clickhouse';
    protected $table = 'analytics_events';
    
    protected $fillable = [
        'event_name',
        'user_id',
        'timestamp',
        'properties'
    ];
    
    // ClickHouse doesn't use auto-incrementing IDs typically
    public $incrementing = false;
    public $timestamps = false;
}

Basic Queries

use App\Models\AnalyticsEvent;

// Insert data
AnalyticsEvent::create([
    'event_name' => 'page_view',
    'user_id' => 123,
    'timestamp' => now(),
    'properties' => json_encode(['page' => '/home'])
]);

// Query data
$events = AnalyticsEvent::where('event_name', 'page_view')
    ->where('timestamp', '>=', now()->subDays(7))
    ->get();

// Aggregate queries
$pageViews = AnalyticsEvent::where('event_name', 'page_view')
    ->count();

$uniqueUsers = AnalyticsEvent::distinct('user_id')->count();

Advanced Analytics Queries

// Time-based aggregations
$dailyStats = AnalyticsEvent::selectRaw('
    toDate(timestamp) as date,
    count() as events,
    uniq(user_id) as unique_users
')
->where('timestamp', '>=', now()->subDays(30))
->groupBy('date')
->orderBy('date')
->get();

// Using ClickHouse-specific functions
$topPages = AnalyticsEvent::selectRaw("
    JSONExtractString(properties, 'page') as page,
    count() as views
")
->where('event_name', 'page_view')
->groupBy('page')
->orderBy('views', 'desc')
->limit(10)
->get();

Raw Queries

For complex ClickHouse-specific queries:

use Illuminate\Support\Facades\DB;

$results = DB::connection('clickhouse')
    ->select('
        SELECT 
            event_name,
            count() as total,
            uniq(user_id) as unique_users,
            avg(toFloat64(JSONExtractString(properties, "duration"))) as avg_duration
        FROM analytics_events 
        WHERE timestamp >= yesterday()
        GROUP BY event_name
        ORDER BY total DESC
    ');

Connection Modes

TCP Mode (Recommended)

Better performance for high-throughput operations:

'mode' => 'tcp',
'port' => 9000, // Default TCP port

HTTP Mode

Better for debugging and development:

'mode' => 'http',
'port' => 8123, // Default HTTP port

Best Practices

1. Schema Design

ClickHouse is optimized for analytical workloads:

CREATE TABLE analytics_events (
    event_name String,
    user_id UInt64,
    timestamp DateTime,
    properties String
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp)
ORDER BY (event_name, timestamp);

2. Batch Inserts

Use batch inserts for better performance:

$events = collect(range(1, 1000))->map(function ($i) {
    return [
        'event_name' => 'test_event',
        'user_id' => $i,
        'timestamp' => now(),
        'properties' => json_encode(['test' => true])
    ];
});

AnalyticsEvent::insert($events->toArray());

3. Avoid Updates/Deletes

ClickHouse is optimized for inserts and selects. Minimize updates and deletes.

Testing

composer test

Code Style

composer format

Static Analysis

composer analyse

Contributing

Please see CONTRIBUTING for details. s

Credits

License

The MIT License (MIT). Please see License File for more information.

Changelog

Please see CHANGELOG for more information on what has changed recently.

统计信息

  • 总下载量: 6
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2025-08-07