因原repo cubettech/lacassa 已經沒有在維護故fork此repo繼續開發,可以給自已使用,有需要的人可以自已使用喔
A Query builder with support for Cassandra, using the original Laravel API. This library extends the original Laravel classes, so it uses exactly the same methods.
-
Installation
-
Configuration
-
Query Builder
-
Schema
-
Extensions
-
Examples
Make sure you have the DataStax PHP Driver for Apache Cassandra installed. You can find installation instructions at https://github.com/datastax/php-driver or https://github.com/datastax/php-driver/blob/master/ext/README.md
datastax php-driver requires php version 5.6+
Installation using composer:
composer require cubettech/lacassa
And add the service provider in config/app.php:
Cubettech\Lacassa\CassandraServiceProvider::class,
Change your default database connection name in config/database.php:
'default' => env('DB_CONNECTION', 'cassandra'),
And add a new cassandra connection:
'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', ''),
],
You can use Laravel's native Auth functionality for cassandra, make sure your config/auth.php looks like
'providers' => [
// 'users' => [
// 'driver' => 'eloquent',
// 'model' => App\User::class,
// ],
'users' => [
'driver' => 'database',
'table' => 'users',
],
],
The database driver also has (limited) schema builder support. You can easily manipulate tables and set indexes:
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');
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 Key
primary(['a', 'b'])
Query Builder
The database driver plugs right into the original query builder. When using cassandra connections, you will be able to build fluent queries to perform database operations.
$emp = DB::table('emp')->get();
$emp = DB::table('emp')->where('emp_name', 'Christy')->first();
If you did not change your default database connection, you will need to specify it when querying.
$emp = DB::connection('cassandra')->table('emp')->get();
Examples
Retrieving All Records
$emp = DB::table('emp')->all();
Indexing columns
CREATE INDEX creates a new index on the given table for the named column.
DB::table('users')->index(['name']);
Selecting columns
$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']);
Wheres
The WHERE clause specifies which rows to query. In the WHERE clause, refer to a column using the actual name, not an alias. Columns in the WHERE clause need to meet one of these requirements:
-
The partition key definition includes the column.
-
A column that is indexed using CREATE INDEX.
$emp = DB::table('emp')->where('emp_no', '>', 50)->take(10)->get();
And Statements
$emp = DB::table('emp')->where('emp_no', '>', 50)->where('emp_name', '=', 'Christy')->get();
Using Where In With An Array
$emp = DB::table('emp')->whereIn('emp_no', [12, 17, 21])->get();
Order By
ORDER BY clauses can select a single column only. Ordering can be done in ascending or descending order, default ascending, and specified with the ASC or DESC keywords. In the ORDER BY clause, refer to a column using the actual name, not the aliases.
$emp = DB::table('emp')->where('emp_name','Christy')->orderBy('emp_no', 'desc')->get();
Limit
We can use limit() and take() for limiting the query.
$emp = DB::table('emp')->where('emp_no', '>', 50)->take(10)->get();
$emp = DB::table('emp')->where('emp_no', '>', 50)->limit(10)->get();
Distinct
Distinct requires a field for which to return the distinct values.
$emp = DB::table('emp')->distinct()->get(['emp_id']);
Distinct can be combined with where:
$emp = DB::table('emp')->where('emp_sal', 45000)->distinct()->get(['emp_name']);
Count
$number = DB::table('emp')->count();
Count can be combined with where:
$sal = DB::table('emp')->where('emp_sal', 45000)->count();
Truncate
$sal = DB::table('emp')->truncate();
You can index the collection column, and then use the CONTAINS condition in the WHERE clause to filter the data for a particular value in the collection.
$emp = DB::table('emp')->where('emp_name','contains', 'Christy')->get();
After indexing the collection keys in the venues map, you can filter on map keys.
$emp = DB::table(emp')->where('todo','contains key', '2014-10-02 06:30:00+0000')->get();
Raw Query
The CQL expressions can be injected directly into the query.
$emp = DB::raw('select * from emp');
Inserts, updates and deletes
Inserting, updating and deleting records works just like the original QB.
Insert
DB::table('emp')->insert(['emp_id' => 11, 'emp_city' => '{"kochi", "tvm", "kollam"}', 'emp_name' => 'Christy', 'emp_phone' => 12345676890, 'emp_sal' => 500]);
Updating
To update a model, you may retrieve it, change an attribute, and use the update method.
DB::table('emp')->where('emp_id', 11)->update(['emp_city' => 'kochi', 'emp_name' => 'Christy jos', 'emp_phone' => 1234567890]);
Update collections in a row. The method will be like
updateCollection(collection_type, column_name, operator, value);
Collection_type is any of set, list or map.
Column_name is the name of column to be updated.
Operator is + or -, + for adding the values to collection and - to remove the value from collection.
Value can be associative array for map type and array of string/number for list and set types.
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();
Deleting
To delete a model, simply call the delete method on the instance. We can delete the rows in a table by using deleteRow method:
$emp = DB::table('emp')->where('emp_city', 'Kochi')->deleteRow();
We can also perform delete by the column in a table using deleteColumn method:
$emp = DB::table('emp')->where('emp_id', 3)->deleteColumn();
Model
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';