PHP code example of rice / lavavel-sharding

1. Go to this page and download the library: Download rice/lavavel-sharding library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

rice / lavavel-sharding example snippets




namespace App\Models;

use Rice\LSharding\DatetimeSharding;

class OrderLog extends DatetimeSharding
{
    protected $table = 'order_logs';

    // 开始时间(确定第一张分表的时间点)
    public function lower()
    {
        return '2024-01-01 00:00:00';
    }

    // 结束时间(null表示当前时间)
    public function upper()
    {
        return null;
    }

    // 分表后缀格式(使用Carbon的format格式)
    // ym 表示按月分表,如 order_logs_2401, order_logs_2402
    public function suffixPattern()
    {
        return 'ym';
    }
    
    // 分片字段(默认为created_at)
    public function shardingColumn()
    {
        return 'created_at';
    }
}



namespace App\Models;

use Rice\LSharding\ModSharding;

class UserData extends ModSharding
{
    protected $table = 'user_data';
    
    // 分片数量
    public function shardingCount()
    {
        return 10; // 分成10张表
    }
    
    // 分片字段
    public function shardingColumn()
    {
        return 'user_id';
    }
    
    // 分片后缀格式
    public function suffixPattern()
    {
        return '_%d'; // 生成 user_data_0, user_data_1 格式
    }
}



namespace App\Models;

use Rice\LSharding\HashModSharding;

class ProductData extends HashModSharding
{
    protected $table = 'product_data';
    
    // 分片数量
    public function shardingCount()
    {
        return 8;
    }
    
    // 分片字段(可以是字符串类型)
    public function shardingColumn()
    {
        return 'product_code'; // 产品编码,字符串类型
    }
    
    // 分片后缀格式
    public function suffixPattern()
    {
        return '_%d';
    }
}



namespace App\Models;

use Rice\LSharding\AutoIntervalSharding;

class ActivityLog extends AutoIntervalSharding
{
    protected $table = 'activity_logs';
    
    // 时间分片下界值
    public function lower(): string
    {
        return '2024-01-01';
    }
    
    // 分片时间间隔
    // 支持格式:1d(天), 1w(周), 1m(月), 1y(年)
    public function interval(): string
    {
        return '1w'; // 每周一个分片
    }
    
    // 分片键时间格式
    public function dateTimeFormat(): string
    {
        return 'YW'; // 年和周数
    }
    
    // 分片字段
    public function shardingColumn(): string
    {
        return 'log_time';
    }
    
    // 分片后缀格式
    public function suffixPattern(): string
    {
        return '_%s';
    }
}



namespace App\Models;

use Rice\LSharding\BoundaryRangeSharding;

class CustomerData extends BoundaryRangeSharding
{
    protected $table = 'customer_data';
    
    // 定义边界范围
    public function getBoundaryRanges(): array
    {
        // 返回边界数组,如 [1000, 5000, 10000]
        // 会分成四个区间:<1000, 1000-5000, 5000-10000, >10000
        return [1000, 5000, 10000];
    }
    
    // 分片字段
    public function shardingColumn(): string
    {
        return 'customer_level'; // 根据客户等级分片
    }
    
    // 分片后缀格式
    public function suffixPattern(): string
    {
        return '_%d';
    }
}



namespace App\Models;

use Rice\LSharding\VolumeRangeSharding;

class LargeData extends VolumeRangeSharding
{
    protected $table = 'large_data';
    
    // 每个分片的容量
    public function shardingVolume(): int
    {
        return 100000; // 每个分片10万条数据
    }
    
    // 起始值
    public function startValue(): int
    {
        return 1;
    }
    
    // 最大值
    public function maxValue(): int
    {
        return 1000000; // 最大100万条数据
    }
    
    // 分片字段
    public function shardingColumn(): string
    {
        return 'id';
    }
    
    // 分片后缀格式
    public function suffixPattern(): string
    {
        return '_%d';
    }
}



namespace App\Models;

use Rice\LSharding\InlineSharding;

class OrderData extends InlineSharding
{
    protected $table = 'order_data';
    
    // 行表达式
    public function inlineExpression(): string
    {
        // user_id % 4 + 1 表示将用户ID取模后+1,分成4个分片
        return '${user_id % 4 + 1}';
    }
    
    // 分片表列表
    public function shardingTables(): array
    {
        return ['1', '2', '3', '4'];
    }
    
    // 分片字段
    public function shardingColumn(): string
    {
        return 'user_id';
    }
    
    // 分片后缀格式
    public function suffixPattern(): string
    {
        return '_%s';
    }
}



namespace App\Models;

use Rice\LSharding\ComplexSharding;

class MultiDimensionData extends ComplexSharding
{
    protected $table = 'multi_data';
    
    // 分片字段列表
    public function shardingColumns(): array
    {
        return ['region_id', 'type_id'];
    }
    
    // 计算分片键
    public function calculateShardingKey(array $params): string
    {
        // 组合多个字段计算分片键
        $regionId = $params['region_id'] ?? 0;
        $typeId = $params['type_id'] ?? 0;
        
        // 可以根据业务需求设计复杂的计算逻辑
        return md5($regionId . '-' . $typeId);
    }
    
    // 分片数量
    public function shardingCount(): int
    {
        return 16;
    }
    
    // 分片后缀格式
    public function suffixPattern(): string
    {
        return '_%d';
    }
}



namespace App\Models;

use Rice\LSharding\HintSharding;

class DynamicData extends HintSharding
{
    protected $table = 'dynamic_data';
    
    // 分片字段
    public function shardingColumn(): string
    {
        return 'shard_key';
    }
    
    // 分片后缀格式
    public function suffixPattern(): string
    {
        return '_%s';
    }
}

// 使用方式
DynamicData::setCurrentSharding('202401'); // 设置当前分片
$results = DynamicData::where('status', 1)->get();
DynamicData::clearCurrentSharding(); // 清除分片设置