LaravelのORM、Eloquentを単品で使用してみる

# はじめに
この記事は[Laravel Advent Calendar 2016](http://qiita.com/advent-calendar/2016/laravel)の12月9日分です。

LaravelにはORMとして、Eloquentと言われるものが存在します。
今回は、そのEloquentをLaravel以外で使用する方法を記していきます。

# 初期設定
まず、EloquentのGithubリポジトリです。
https://github.com/illuminate/database

使用方法はすべてリポジトリに書いてありますので、今回はそれに沿って使ってみたいと思います。

まずは、インストールからです。
composer.jsonに以下を追記しましょう。

```json
{
 "require": {
    "illuminate/database": "*"
  }
}
```

composer installを実行すると、Eloquent周りのファイルがvender配下に配置されます。

Eloquentを使用する前に、初期設定を行わなければいけません。
これをbootstrap.phpとして保存しておきましょう。

```php:bootstrap.php
require_once 'vendor/autoload.php';

use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule;

$capsule->addConnection([
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'eloquent_test',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
]);

$capsule->setAsGlobal();
$capsule->bootEloquent();
```

Githubのドキュメントの通りですね。
後はこのbootstrap.phpを読み込んで使用するだけです。


## テーブル作成
Laravelでマイグレーションを行うのと同様のコードで実装できます。

```php
require_once 'bootstrap.php';

use Illuminate\Database\Capsule\Manager as Capsule;

Capsule::schema()->create('users', function ($table) {
    $table->increments('id');
    $table->string('email');
    $table->timestamps();
});
```

# 実践
実際に使用する方法を記載していきます。
Eloquentではクエリービルダーを使用する方法とモデルを作成して使用する方法があると思いますが、これは単品で使用する時も同様です。

## クエリ発行
クエリービルダーを使用する方法です。
コメントアウトしてある行とその下の行は同じ動きをするものです。

### 挿入
```php
require_once 'bootstrap.php';

use Illuminate\Database\Capsule\Manager as Capsule;

//$result = Capsule::insert('insert into users VALUES (null, "test@example.com", null, null)');
$result = Capsule::table('users')->insert([
    'email' => 'test@example.com'
]);
```
### 選択
```php
require_once 'bootstrap.php';

use Illuminate\Database\Capsule\Manager as Capsule;

//$result = Capsule::select('select * from users');
$result = Capsule::table('users')->select('*')->get()->toArray();
```
### 更新
```php
require_once 'bootstrap.php';

use Illuminate\Database\Capsule\Manager as Capsule;

//$result = Capsule::update('update users set email = "change@example.com" where id = 1;');
$result = Capsule::table('users')
    ->where('id', 1)
    ->update(['email' => 'change@example.com']);
```
### 削除
```php
require_once 'bootstrap.php';

use Illuminate\Database\Capsule\Manager as Capsule;

//$result = Capsule::delete('DELETE FROM users WHERE id = 6');
$result = Capsule::table('users')->delete(3);
```

## モデル作成
もちろんモデルを作成して、各メソッドを呼び出すこともできます。

```php
namespace Model;

use Illuminate\Database\Eloquent\Model as EloquentModel;

class User extends EloquentModel
{
    protected $fillable = ['email'];
}
```

### 挿入

```php
require_once 'bootstrap.php';

use Model\User;

//$user = new User;
//$user->email = 'test@example.com';
//$user->save();

$user = User::create([
    'email' => 'test2@example.com'
]);
```

### 選択
```php
require_once 'bootstrap.php';

use Model\User;

$userArray = User::find(1);
```

### 更新
```php
require_once 'bootstrap.php';

use Model\User;

$user = User::find(1);
$user->update([
    'email' => 'change@example.com'
]);
```

### 削除
```php
require_once 'bootstrap.php';

use Model\User;

User::find(2)->delete();
```

# 最後に
難点としては、artisanコマンド、Migrationを行えないことです。
Lumenを使用した場合、どちらも行うことができるので、Lumenを利用するか単品で使うかよく考えて使用するといいでしょう。