lroman242/laravel-cassandra

基于 Cassandra 的 Eloquent 模型和查询构建器,用于 Laravel(Casloquent)

dev-master 2019-07-15 18:11 UTC

This package is auto-updated.

Last update: 2024-09-16 05:38:33 UTC


README

基于 Cassandra 的 Eloquent 模型和查询构建器,用于 Laravel(Casloquent)

Scrutinizer Code QualityCode CoverageBuild Status

实际测试覆盖率远低于预期

安装

Laravel 版本兼容性

请确保已安装 Cassandra PHP 驱动程序(版本 1.2+)。更多信息请访问 http://datastax.github.io/php-driver/

使用 composer 安装

composer require lroman242/laravel-cassandra

Laravel

并在 config/app.php 中添加服务提供者

lroman242\LaravelCassandra\CassandraServiceProvider::class,

服务提供者将注册一个 Cassandra 数据库扩展与原始数据库管理器。无需注册额外的外观或对象。当使用 Cassandra 连接时,Laravel 将自动为您提供相应的 Cassandra 对象。

对于 Laravel 之外的使用,请查看 Capsule 管理器 并添加

$capsule->getDatabaseManager()->extend('cassandra', function($config)
{
    return new lroman242\LaravelCassandra\Connection($config);
});

Lumen

将以下行添加到您的 bootstrap.php

    $app->configure('database');
    $app->register(lroman242\LaravelCassandra\CassandraServiceProvider::class);

配置

config/database.php 中更改您的默认数据库连接名称

'default' => env('DB_CONNECTION', 'cassandra'),

并添加一个新的 Cassandra 连接

'cassandra' => [
    'driver'          => 'cassandra',
    'host'            => env('DB_HOST', 'localhost'),
    'port'            => env('DB_PORT', 9042),
    'keyspace'        => env('DB_DATABASE'),
    'username'        => env('DB_USERNAME'),
    'password'        => env('DB_PASSWORD'),
    'page_size'       => env('DB_PAGE_SIZE', 5000),
    'consistency'     => Cassandra::CONSISTENCY_LOCAL_ONE,
    'timeout'         => null,
    'connect_timeout' => 5.0,
    'request_timeout' => 12.0,
],

您可以使用以下配置连接到多个服务器

'cassandra' => [
    'driver'          => 'cassandra',
    'host'            => ['192.168.0.1', '192.168.0.2'], //or '192.168.0.1,192.168.0.2'
    'port'            => env('DB_PORT', 9042),
    'keyspace'        => env('DB_DATABASE'),
    'username'        => env('DB_USERNAME'),
    'password'        => env('DB_PASSWORD'),
    'page_size'       => env('DB_PAGE_SIZE', 5000),
    'consistency'     => Cassandra::CONSISTENCY_LOCAL_ONE,
    'timeout'         => null,
    'connect_timeout' => 5.0,
    'request_timeout' => 12.0,
],

注意:您可以将所有节点都输入到 .env 中,如下所示

# .env
DB_HOST=192.168.0.1,192.168.0.2,192.168.0.3

注意:可用的可用一致性级别(PHP 常量)列表

Cassandra::CONSISTENCY_ANY
Cassandra::CONSISTENCY_ONE
Cassandra::CONSISTENCY_TWO
Cassandra::CONSISTENCY_THREE
Cassandra::CONSISTENCY_QUORUM
Cassandra::CONSISTENCY_ALL
Cassandra::CONSISTENCY_SERIAL
Cassandra::CONSISTENCY_QUORUM
Cassandra::CONSISTENCY_LOCAL_QUORUM
Cassandra::CONSISTENCY_EACH_QUORUM
Cassandra::CONSISTENCY_LOCAL_SERIAL
Cassandra::CONSISTENCY_LOCAL_ONE

注意:您可以使用选项根据查询设置特定的一致性级别

Eloquent

模型使用

支持大多数 Eloquent 查询构建器功能、事件、字段访问。

    $users = User::all();
    
    $user = User::where('email', 'tester@test.com')->first();
    
    $user = User::find(new \Cassandra\Uuid("7e4c27e2-1991-11e8-accf-0ed5f89f718b"))

关系 - 不支持

属性转换

可以使用 UUID 作为模型主键

class Item 
{
    ...
    
    protected $keyType = 'uuid';
    
    public $incrementing = true; // will automatically cast your primary key to keyType
    
    // OR
    
    protected $keyType = 'uuid';
    
    public $incrementing = false;
    
    protected $casts = [
        'id' => 'uuid',
    ];    
    ...
}

查询构建器

数据库驱动程序直接集成到原始查询构建器。当使用 Cassandra 连接时,您将能够构建流畅的查询以执行数据库操作。

$users = DB::table('users')->get();

$user = DB::table('users')->where('name', 'John')->first();

如果您没有更改默认数据库连接,则查询时需要指定它。

$user = DB::connection('cassandra')->table('users')->get();

查询构建器默认使用 get 方法将调用从数据库中分块获取。分块大小可以在配置文件中配置( 'page_size' => env('DB_PAGE_SIZE', 5000))或使用额外的查询构建器方法 setPageSize

$comments = Comments::setPageSize(500)->get(); // will return all comments, not 500

警告:如果表中有很多数据,不建议使用 get。请改用 getPage

获取单页结果

$comments = Comments::setPageSize(500)->getPage(); // will return collection with 500 results

可以设置下一页令牌,这允许获取下一块结果

$comments = Comments::setPaginationStateToken($token)->getPage();

获取下一页

$comments = $comments->nextPage();

获取下一页令牌

$comments = $comments->getNextPageToken();

将下一页的结果添加到集合中

$comments->appendNextPage();

检查是否是最后一页

$comments->isLastPage();

获取当前页面的 Cassandra 原始响应(\Cassandra\Rows)

$rows = $commants->getRows();

有关查询构建器的更多信息,请参阅 https://laravel.net.cn/docs/queries

示例

  • 将用户数据存储到 csv
$users = User::setPageSize(1000)->getPage();
while(!$users->isLastPage()) {
    foreach($users as $user) {
        // here you can write a lines to csv file
    }
    
    $users = $users->nextPage();
}
  • 简单的 API,用于在页面上实现“加载更多”作为分页
public function getComments(Request $request) {
    ...
    
    $comments = Comment::setPageSize(50)
        ->setPaginationStateToken($request->get('nextPageToken', null)
        ->getPage();
    
    ...
    
    return response()->json([
        ...
        'comments' => $comments,
        'nextPageToken' => !$comments->isLastPage() ? $comments->getNextPageToken() : null,
        ...
    ]);
}
  • 如果您使用 Cassandra 物化视图,可以轻松地与 Eloquent 模型一起使用
$users = User::from('users_by_country_view')->where('country', 'USA')->get();

TODO

  • 完全支持复合主键
  • 完整的测试覆盖率
  • 修复 \Cassandra\Date 与 Carbon 之间的差异
  • 添加模式查询支持
  • 添加使用异步查询的能力

Docker

在包根目录中存储了 docker-compose 设置。它可用于本地开发和测试运行。与 PHPStorm 测试工具和覆盖率配合良好。

在 "main" 容器内运行以下命令以运行测试并生成覆盖率文件

vendor/bin/phpunit --coverage-clover clover.xml