Laravel4 Eloquent ORMを試してみる

raharu(仮名)(プログラマー)
これがダイバージェンス1%の先の世界か。。。

ドキュメントもしっかりしてるし考えられて作られているなーと思うLaravelですが、
日本で全くといって良いほど流行ってねー()
2年前からあるはずなのになんでこんなに過疎ってるんでしょうかね。。
もっと流行っても良いと思うんですけどね、ステッカー欲しいです

とま今回は個人プロジェクトのバック用に使用しているだけなので
別に流行ってようが流行ってなかろうが関係無いんですけどね。

今回はEloquent ORMを試します。

前回同様適当なテーブルを作成しておきます。

<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateCalendarTable extends Migration {
>.../**
>... * Run the migrations.
>... *
>... * @return void
>... */
>...public function up()
>...{
Schema::create('calendar', function($table){
$table->increments('id');
$table->string('area_name', 32);
$table->date('onair_date');
$table->time('onair_time');
$table->string('title', 128);
$table->string('url', 256);
$table->string('station', 64);
$table->string('state', 64);
$table->string('episode', 32)->nullable();
$table->string('week_name', 32);
$table->timestamps();
$table->softDeletes();
});
>...}
>.../**
>... * Reverse the migrations.
>... *
>... * @return void
>... */
>...public function down()
>...{
Schema::drop('calendar');
>...}
}

deleteは論理削除で行いたいのでsoftDeletesを追加しています。
これをマイグレートしてテーブルを作成しました

f:id:raharu0425:20150107170756p:plain

このテーブルにレコード追加します 前回の記事では マイグレーションを試してみる

DB::insert('insert into template (`key`, `value`, `created_at`, `updated_at`) values(?, ?, ?, ?)', array('template.v1', 'hogehogehogehoge', $now_timestamp, $now_timestamp));

こんな書き方だったのですが、今回はO/Rマッパーを使うのでそこら辺りもいい感じに
出来ると期待しています。

Eloquentモデルを作成する

app/models/以下にモデルの受け皿となるクラスを作成します。
(これを作成するartisanコマンドないのか。。。)

<?php
class Calendar extends Eloquent {
// SoftDelete
use SoftDeletingTrait;
protected $dates = ['deleted_at'];
//テーブル名
protected $table = 'calendar';
/**
* createメソッド利用時に、入力を受け付けないカラムの指定
*/
protected $guarded = array('id');
}

意外にprotected $guarded = array(‘id’);
が重要でidはオートインクリメントされているのでインサート時に指定しなかったわけだが
それだとエラーにされるという落とし穴がある。

Laravel4のEloquent ORMではまった件

レコード作成例

<?php
~~skip
$record = new Calendar;
$record->area_name = $area_name;
$record->title = $item->title;
$record->url = $item->url;
$record->onair_time = $item->time;
$record->station = $item->station;
$record->state = $item->state;
$record->onair_date = $item->next;
$record->week_name = $item->week;
Calendar::firstOrCreate($record->getAttributes());

$record = new Calendar;
でテーブル本体をインスタンス化してカラムに値を追加しています
実際は$record->save()だけで事が済むんですが同一レコードを入れたく無かったので
今回はfirstOrCreateを使用しています

f:id:raharu0425:20150107173018p:plain

ばっちり入りました

これでSQLをガチで書く様な事をしなくてすっきり書けます。
いい感じですね、ベンチマーク取ってどの程度負荷に耐えられるのか試してみたくなりました。

次は参照やあれこれやってみたいと思っています。