Kettle is a lightweight object-dynamodb mapper for PHP. Kettle provides a simple interface to Amazon DynamoDB.
<?php
use Kettle\ORM;
$user = ORM::factory('User')->findOne(10);
$user->name = 'John';
$user->save();
$tweets = ORM::factory('Tweet')->where('user_id', 10)
->findMany();
foreach ($tweets as $tweet) {
echo $tweet->text . PHP_EOL;
}
- Installation
Package is available on Packagist, you can install it using Composer.
$ cat <<EOF > composer.json
{
"require": {
"kettle/dynamodb-orm": "0.2.*"
}
}
EOF
$ composer install
- Configuration
<?php
use Kettle\ORM;
ORM::configure("key", 'AWS_KEY');
ORM::configure("secret", 'AWS_SECRET');
ORM::configure("region", 'AWS_REGION');
// In order to use DynamoDB Local, you need to set "base_url".
// ORM::configure("base_url", 'http://localhost:8000/');
If you are using multiple aws account, use as follows.
<?php
use Kettle\ORM;
ORM::configure("key", 'AWS_KEY', 'account-2');
ORM::configure("secret", 'AWS_SECRET', 'account-2');
ORM::configure("region", 'AWS_REGION', 'account-2');
$user = ORM::factory('User', 'account-2');
- Create Model Class
<?php
class User extends ORM {
protected $_table_name = 'user';
protected $_hash_key = 'user_id';
protected $_schema = array(
'user_id' => 'N', // user_id is number
'name' => 'S', // name is string
'age' => 'N',
'country' => 'S',
);
}
If you use a generator, you can also create an class as follows.
$ php bin/kettle-skeleton.php --table-name user --region ap-northeast-1 > User.php
Table must have been created in advance. Because this generator generates a class based on the information and data collected by the "describeTable" and "scan" operation.
- Create
<?php
$user = ORM::factory('User')->create();
$user->user_id = 1;
$user->name = 'John';
$user->age = 20;
$user->save();
- Retrieve
<?php
$user = ORM::factory('User')->findOne(1);
echo $user->name. PHP_EOL;
print_r($user->asArray());
- Update
<?php
$user = ORM::factory('User')->findOne(1);
$user->age = 21;
$user->save();
- Delete
<?php
$user = ORM::factory('User')->findOne(1);
$user->delete();
- Find
<?php
$tweets = ORM::factory('Tweets')
->where('user_id', 1)
->where('timestamp', '>', 1397264554)
->findMany();
foreach ($tweets as $tweet) {
echo $tweet->text . PHP_EOL;
}
- Find first record
<?php
$tweet = ORM::factory('Tweets')
->where('user_id', 1)
->where('timestamp', '>', 1397264554)
->findFirst();
echo $tweet->text . PHP_EOL;
- Find by Global Secondary Index
<?php
$users = ORM::factory('User')
->where('country', 'Japan')
->where('age', '>=', 20)
->index('country-age-index') // specify index name
->findMany();
- Query Filtering
<?php
$tweets = ORM::factory('Tweets')
->where('user_id', 1)
->filter('is_deleted', 0) // using filter
->findMany();