tachii/lacassa

此包已废弃,不再维护。未建议替代包。

基于Cassandra的Laravel查询构建器。

v1.3.8 2018-01-11 02:26 UTC

This package is not auto-updated.

Last update: 2023-12-25 20:47:06 UTC


README

由于原repo cubettech/lacassa 已经停止维护,因此 fork 此 repo 继续开发,可以供自己使用,有需要的人可以自己使用哦

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

目录

  • 安装

  • 配置

  • 查询构建器

  • 模式

  • 扩展

  • 示例

安装

确保您已安装 Apache Cassandra 的 DataStax PHP 驱动。您可以在 https://github.com/datastax/php-driverhttps://github.com/datastax/php-driver/blob/master/ext/README.md 找到安装说明。

datastax php-driver 需要 php 版本 5.6+

使用 composer 安装

composer require cubettech/lacassa

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

Cubettech\Lacassa\CassandraServiceProvider::class,

配置

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

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

并添加一个新的 cassandra 连接

'cassandra' => [
	 	'driver' => 'Cassandra',
		'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', 7199),
        'keyspace' => env('DB_DATABASE', 'cassandra_db'),
    	'username' => env('DB_USERNAME', ''),
    	'password' => env('DB_PASSWORD', ''),
 ],

认证

您可以使用 Laravel 的原生认证功能进行 cassandra,确保您的 config/auth.php 看起来像

    'providers' => [
    // 'users' => [
    //     'driver' => 'eloquent',
    //     'model' => App\User::class,
    // ],
    'users' => [
        'driver' => 'database',
        'table' => 'users',
    ],
        ],

模式

数据库驱动程序还支持(有限的)模式构建器。您可以轻松地操作表并设置索引

    Schema::create(
        'users', function ($table) {
            $table->int('id');
            $table->text('name');
            $table->text('email');
            $table->text('password');
            $table->text('remember_token');
            $table->setCollection('phn', 'bigint');
            $table->listCollection('hobbies', 'text');
            $table->mapCollection('friends', 'text', 'text');
            $table->primary(['id']);
      });

DROP table

    Schema::drop('users');

支持的 CQL 数据类型

text('a')

bigint('b')

blob('c')

boolean('d')

counter('e')

decimal('f')

double('g')

float('h')

frozen('i')

inet('j')

nt('k')

listCollection('l', 'text')

mapCollection('m', 'timestamp', 'text')

setCollection('n', 'int')

timestamp('o')

timeuuid('p')

tuple('q', 'int', 'text', 'timestamp')

uuid('r')

varchar('s')

varint('t')

ascii('u')

主键

primary(['a', 'b'])

查询构建器

数据库驱动程序直接集成到原始查询构建器。当使用 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();

唯一值

唯一值需要指定一个字段来返回不同的值。

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

唯一值可以与where结合使用

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

计数

$number = DB::table('emp')->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();

索引venue映射中的集合键之后,您可以过滤映射键。

$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')->insert(['emp_id' => 11, 'emp_city' => '{"kochi", "tvm", "kollam"}', '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' =>  1234567890]);

更新集合、列表和映射

一行更新集合。方法如下

updateCollection(collection_type, column_name, operator, value);

Collection_type可以是set、list或map中的任何一种。

Column_name是要更新的列的名称。

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

Value对于map类型是关联数组,对于list和set类型是字符串/数字数组。

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();

删除

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

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

我们还可以使用deleteColumn方法通过表中的列进行删除

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

模型

Model请extends '''use Cubettech\Lacassa\Eloquent\Model;''' 这个Model,然后$connection选择Cassandra的connection即可 例如:config/database.php

'cassandra' => [
            'driver' => 'Cassandra',
            'host' => env('CASSANDRA_HOST', '127.0.0.1'),
            'port' => env('CASSANDRA_PORT', 9048),
            'keyspace' => env('CASSANDRA_KEYSPACE', 'quote'),
            'database' => env('CASSANDRA_KEYSPACE', 'quote')
        ]
use Cubettech\Lacassa\Eloquent\Model

class CassandraTable extends Model
{

    protected $connection = 'cassandra';