danielhe4rt / scylloquent
Cassandra/ScyllaDB 驱动程序,用于 Eloquent ORM
Requires
- php: >=8.2
- ext-cassandra: ^1.3
- illuminate/console: ^9.0 | ^10.0
- illuminate/container: ^9.0 | ^10.0
- illuminate/database: ^9.0 | ^10.0
- illuminate/events: ^9.0 | ^10.0
- illuminate/support: ^9.0 | ^10.0
Requires (Dev)
- mockery/mockery: ^1.2
- nunomaduro/collision: ^7.4
- nunomaduro/larastan: ^2.0
- orchestra/testbench: ^8.1
- phpunit/phpunit: ^8.0 | ^9.0 | ^10.0
This package is auto-updated.
Last update: 2024-09-17 21:18:43 UTC
README
Scylla/Cassandra 驱动程序,用于 Eloquent ORM。
安装
注意: 确保您已安装 He4rt ScyllaDB PHP 驱动程序(版本 1.3+)。更多信息请参阅 He4rt ScyllaDB PHP Driver。
使用 composer 安装
composer require danielhe4rt/scylloquent
Laravel
并在 config/app.php
中添加服务提供者
DanielHe4rt\Scylloquent\ScylloquentServiceProvider::class,
服务提供者将注册一个与原始数据库管理器兼容的 Cassandra 数据库扩展。无需注册额外的外观或对象。当使用 Cassandra 连接时,Laravel 将自动为您提供相应的 Cassandra 对象。
对于 Laravel 之外的使用,请参阅 Capsule manager 并添加
$capsule->getDatabaseManager()->extend('scylla', function($config) { return new DanielHe4rt\Scylloquent\Connection($config); });
Lumen
将以下行添加到您的 bootstrap.php
$app->configure('database');
$app->register(DanielHe4rt\Scylloquent\ScylloquentServiceProvider::class);
配置
如果您想更改默认数据库连接名称,请修改 config/database.php
'default' => env('DB_CONNECTION', 'scylla'),
并添加一个新的 Cassandra 连接
'scylla' => [ 'driver' => 'cassandra', 'scheme' => env('DB_SCHEME', 'tcp'), '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, 'ssl' => [ 'verify_peer' => nv('DB_SSL_VERIFY_PEER', false), 'trusted_cert' => nv('DB_SSL_TRUSTED_CERT_FILE', null), 'client_cert' => nv('DB_SSL_CLIENT_CERT_FILE', null), 'private_cert' => nv('DB_SSL_PRIVATE_CERT_FILE', null), 'private_passphrase' => nv('DB_SSL_PRIVATE_PASSPHRASE', null), ], ],
您可以使用以下配置连接到多个服务器
'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();
待办事项
- 完全支持组合主键
- 完整的测试覆盖率
- 修复 \Cassandra\Date 与 Carbon 之间的差异
- 添加模式查询支持
- 添加异步查询功能
Docker
在包根目录中有一个 docker-compose 设置。它可以用于本地开发和测试运行。与 PHPStorm 测试工具 + 覆盖率配合良好。
在“main”容器内部运行以下命令以运行测试并生成覆盖率文件
vendor/bin/phpunit --coverage-clover clover.xml