日記

日々のことと、Python/Django/PHP/Laravel/nodejs などソフトウェア開発のことを書き綴ります

Laravel 5.1 入門記 その11 (Eloquent 更新編)

久々なので立て続けに。 前回同様に教材はこちら。

Eloquent: Getting Started - Laravel - The PHP Framework For Web Artisans

今回は簡単な内容なので、さくさくと。

データの新規登録と更新

前回使っていた Flight クラスを使ってデータを新規登録する例です。コンソールからやるとお手軽。

$ php artisan tinker

で、起動して。

$flight = new App\Flight;
$flight->name = 'ファーストフライト';

$flight->save();

以上。ここで注意がいるとすると、Eloquent モデルはデフォルトで updated_at / created_at のタイムスタンプ更新に対応しているということ。

そのため、DDL を用意する時は以下の様な感じなります。

CREATE TABLE flights (
    id intgeger not null auto increment,
    name varchar(50) not null,
    created_at timestamp not null,
    updated_at timestamp not null,
    primary key (id)
);

created_at と updated_at が必要になるだけではなく、id カラムをオートインクリメントかつプライマリキーに指定してます。

続いて UPDATE。

$flight = App\Flight::find(1);
$filght->name = 'セカンドフライト';
$flight->save();

こんな感じです。既に存在するデータに対して save を行った時は UPDATE が発行され、タイムスタンプも updated_at のみが更新されます。

複数のデータをまとめて更新したい場合は、以下の様に Query Builder の update を使用します。

App\Flight::where('active', 1)->update(['active', 0]);

最後に DELETE。UPDATE と同様にいくつかのやり方があります。

$flight = App\Flight::find(1);
$flight->delete();

まとめて消すことも。

App\Flight::destroy(1);
App\Flight::destroy([1, 2, 3, 4]);

App\Flight::where('active', 0)->delete();

Mass Assignment

マスタメンテの管理画面を作っている時は、 HTML の Form で指定したパラメータを、無駄なコードを書かずにデータを保存したいですよね。 それ、Eloquent で簡単にできます。

連想配列をそのままモデルにバインドするメソッドが用意されていて、以下の様な感じ。

App\Flight::create(['name' => 'らくらくフライト']);

これで行けるかと思いきや、これだけでは実行エラーが発生します。この方法でデータ登録を行うには モデルクラスに $fillable を追加します。この $fillable に指定したカラム名が「許可リスト」として、データ保存できるようになります。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['name'];
}

$fillable の指定が必要な理由としては、画面上で編集が許可されていないようなフィールド(例えば、金額とかパスワードとか)が、想定外に編集されてしまうことを防ぐための仕組みになっています。

カラム数が非常に多く、ほとんどの項目が画面上で編集できるような場合は、逆に拒否リストを指定することもできます。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $guarded = ['price'];
}

このような感じです。これで、price 以外の項目が Flight::create を使用して設定出来るようになります。

Of course, you should use either $fillable or $guarded - not both

とのことなので、 fillable と guarded はどちらか片方が使用できます。

この Mass Assignment を利用すれば

$flight = new App\Flight;
$flight->name = $request->name;
$flight->slug = $request->slug;

などのコードは必要無く、コード量を削減できるようになります。 せっかく、Laravel を使うのであれば、こういった機能も使って、少ないコードで色々な処理を実現していきたいところですね。

次回は、Soft Deletes について書きます。