cipwebapp/laravel-cassandra

基于Cassandra的Laravel查询构建器。

v1.1.6 2019-09-22 07:05 UTC

This package is auto-updated.

Last update: 2024-09-22 18:17:21 UTC


README

Build Status codecov

正在开发新版本,请等待文档更新

一个支持Cassandra的查询构建器,使用原始Laravel API。这个库扩展了原始Laravel类,因此使用完全相同的方法。

目录

  • 安装

  • 配置

  • 查询构建器

  • 模式

  • 扩展

  • 示例

安装

确保您已安装Apache Cassandra的数据Stax PHP驱动程序。您可以在datastax仓库找到安装说明。

注意: datastax php-driver 仅与 php 版本 5.6.*, 7.0.* 和 7.1.* 兼容

使用composer安装

composer require cipwebapp/laravel-cassandra

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

# config/app.php
...
providers: [
    ...,
    cipwebapp\Lacassa\CassandraServiceProvider::class,
    ...,
],
...

配置

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

# config/database.php
'default' => env('DB_CONNECTION', 'cassandra'),

并添加新的cassandra连接

# config/database.php
'cassandra' => [
    'driver' => 'cassandra',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', 9042),
    'keyspace' => env('DB_DATABASE', 'cassandra_db'),
    'username' => env('DB_USERNAME', ''),
    'password' => env('DB_PASSWORD', ''),
    'page_size' => '5000',
    'consistency' => 'local_one',
    'timeout' => null,
    'connect_timeout' => 5.0,
    'request_timeout' => 12.0,
],

注意: 您可以将所有节点输入如下:

# .env
DB_HOST=192.168.100.140,192.168.100.141,192.168.100.142

注意: 您可以选择以下一致性级别之一:

查询构建器

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

$emp = DB::table('emp')->get();
$emp = DB::table('emp')->where('emp_name', 'Christy')->first();

如果您没有更改默认数据库连接,您需要在每次查询中指定它。

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

示例

检索所有记录

$emp = DB::table('emp')->all();

索引列

CREATE INDEX 在给定表上为命名列创建新的索引。

DB::table('users')->index(['name']);

选择列

$emp = DB::table('emp')->where('emp_no', '>', 50)->select('emp_name', 'emp_no')->get();
$emp = DB::table('emp')->where('emp_no', '>', 50)->get(['emp_name', 'emp_no']);

WHERE子句

WHERE子句指定要查询的行。在WHERE子句中,使用实际名称引用列,而不是别名。WHERE子句中的列需要满足以下要求之一

  • 分区键定义包括该列。

  • 使用 CREATE INDEX 索引的列。

$emp = DB::table('emp')->where('emp_no', '>', 50)->take(10)->get();

AND语句

$emp = DB::table('emp')->where('emp_no', '>', 50)->where('emp_name', '=', 'Christy')->get();

使用数组中的Where In

$emp = DB::table('emp')->whereIn('emp_no', [12, 17, 21])->get();

ORDER BY

ORDER BY 子句只能选择单个列。排序可以是升序或降序,默认为升序,可以用 ASC 或 DESC 关键字指定。在 ORDER BY 子句中,使用实际名称引用列,而不是别名。

$emp = DB::table('emp')->where('emp_name', 'Christy')->orderBy('emp_no', 'desc')->get();

限制

我们可以使用 limit() 和 take() 限制查询。

$emp = DB::table('emp')->where('emp_no', '>', 50)->take(10)->get();
$emp = DB::table('emp')->where('emp_no', '>', 50)->limit(10)->get();

Distinct

Distinct需要一个 主键 字段来返回不同的值。

$emp = DB::table('emp')->distinct()->get(['emp_id']);

Distinct可以与 where 结合使用

$emp = DB::table('emp')->where('emp_sal', 45000)->distinct()->get(['emp_name']);

Count

$number = DB::table('emp')->count();

Count可以与 where 结合使用

$sal = DB::table('emp')->where('emp_sal', 45000)->count();

截断

$sal = DB::table('emp')->truncate();

过滤集合集、列表或映射

您可以索引集合列,然后在WHERE子句中使用CONTAINS条件来过滤特定值的数据。

$emp = DB::table('emp')->where('emp_name', 'contains', 'Christy')->get();

索引场馆映射中的集合键后,您可以针对映射键进行过滤。

$emp = DB::table('emp')->where('todo', 'contains key', '2014-10-02 06:30:00+0000')->get();

原始查询

可以将CQL表达式直接注入到查询中。

$emp = DB::raw('select * from emp');

插入、更新和删除

插入、更新和删除记录的工作方式与原始QB相同。

插入

DB::table('emp')
    ->insertCollection('set', 'phn', [123, 1234, 12345])
    ->insertCollection('map', 'friends', [['John', 'Male'], ['Eli', 'Female']])
    ->insert([
        'emp_id' => 11,
        'emp_name' => 'Christy',
        'emp_phone' => 12345676890,
        'emp_sal' => 500
    ]);

更新

要更新模型,您可能需要检索它,更改一个属性,然后使用更新方法。

DB::table('emp')
    ->where('emp_id', 11)
    ->update([
        'emp_city' => 'kochi',
        'emp_name' => 'Christy jos',
        'emp_phone' =>  123456789
    ]);

更新集合集、列表和映射

在一行中更新集合。方法如下

updateCollection(collection_type, column_name, operator, value);

Collection_type 是集合、列表或映射之一。

Column_name 是要更新的列的名称。

Operator 是 + 或 -,+ 用于向集合中添加值,- 用于从集合中删除值。

值可以是关联数组(用于映射类型),也可以是字符串/数字数组(用于列表和集合类型)。

DB::table('users')->where('id', 1)
    ->updateCollection('set', 'phn', '+', [123, 1234,12345])->update();

DB::table('users')->where('id', 1)
    ->updateCollection('set', 'phn', '-', [123])->update();

DB::table('users')->where('id', 1)
    ->updateCollection('list', 'hobbies', '+', ['reading', 'cooking', 'cycling'])->update();

DB::table('users')->where('id', 1)
    ->updateCollection('set', 'phn', '+', [123, 1234,12345])->update();

DB::table('users')->where('id', 1)
    ->updateCollection('set', 'phn', '-', [123])->update();

DB::table('users')->where('id', 1)
    ->updateCollection('list', 'hobbies', '+', ['reading', 'cooking', 'cycling'])->update();

DB::table('users')->where('id', 1)
    ->updateCollection('list', 'hobbies', '-', ['cooking'])->update();

DB::table('users')->where('id', 1)
    ->updateCollection('map', 'friends', '+', [['John', 'Male'], ['Rex', 'Male']])->update();

DB::table('users')->where('id', 1)
    ->updateCollection('map', 'friends', '-', ['John'])->update();

DB::table('users')->where('id', 1)
    ->updateCollection('map', 'friends', '+', [['John', 'Male'], ['Rex', 'Male']])->update();

DB::table('users')->where('id', 1)
    ->updateCollection('map', 'friends', '-', ['John'])->update();

删除

要删除一个模型,只需在实例上调用删除方法。我们可以通过使用deleteRow方法来删除表中的行

$emp = DB::table('emp')->where('emp_city', 'Kochi')->deleteRow();

我们还可以通过使用deleteColumn方法在表中按列执行删除操作

$emp = DB::table('emp')->where('emp_id', 3)->deleteColumn();

测试

我已经创建了一个Docker容器,其中安装了php7.0和cassandra php驱动程序。出于测试目的,建议使用Docker。

此外,还有一个run可执行文件,用于简化Docker容器的使用。它会检查一切,确保所有依赖项和cassandra服务器都在运行,然后将您的命令传递到容器中。