【Laravel】Eloquentを使ったモデルを理解する

もくじ

モデル

モデルとは

データベースとコントローラーを結ぶ役割を担うのがLaravelにおけるモデルです。

データベースやテーブル自体に関する設定はモデルに記述します。

基本的に一つのデータベーステーブルに対して一つのモデルを持ちます。

モデル作成

$ php artisan make:model Flight

モデル作成時にマイグレーションも生成したければ、--migrationもしくは-mオプションが使えます。

$ php artisan make:model Flight --migration
$ php artisan make:model Flight -m

テーブルの指定

指定しなくても問題ありません。

指定しない場合はクラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。

class Flight extends Model
{
    /**
     * モデルと関連しているテーブル
     *
     * @var string
     */
    protected $table = 'my_flights';
}

主キー(プライマリキー)

主キー変更

protectedのprimaryKeyプロパティを定義すれば、主キーを独自に設定できます。

デフォルト状態ではLaravelのEloquentはidというカラム名がそのテーブルの主キーになると想定しています。そのidを無効にして、明示的に指定します。

class Flight extends Model
{
    /**
     * テーブルの主キー
     *
     * @var string
     */
    protected $primaryKey = 'flight_id';
}

自動増分ではない主キー

さらに、Eloquentは主キーを自動増分される整数値であるとも想定しています。

自動増分ではない、もしくは整数値ではない主キーを使う場合、モデルにpublicの$incrementingプロパティを用意し、falseをセットします。

class Flight extends Model
{
    /**
     * IDが自動増分されるか
     *
     * @var bool
     */
    public $incrementing = false;
}

整数でない主キー

{
    /**
     * 自動増分IDの「タイプ」
     *
     * @var string
     */
    protected $keyType = 'string';
}

全部必要なの?

UUID(一意なID)を主キーにしたい場合、$incrementing$keyTypeの両プロパティを設定した方が良さそうです。

実験された方の記事に、無駄な処理が実行されている云々と書かれていました。

参考URL;Laravel の主キーで UUID を利用する時にハマった事、調べた事 - 沖縄で IT エンジニアやってます!

複数代入

$fillableでフィールドへの代入を許可します。

create()やfill()、update()の際、値の代入を許可するフィールドを設定します。つまりそれ以外は代入が拒否されます。

class User extends Model
{
  /**
   * 複数代入する属性
   *
   * @var array
   */
  protected $fillable = [
    'name',
    'sex'
  ];
}

このようにかくと、nameとsexのみ書き換えられます。基本的にテーブルにあるカラムは全部入れるといいでしょう。

Eloquentを使ってモデル記述

まず、以下のモデルがapp/Modelsディレクトリにある想定です。

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    //
}

モデルを使用するために、使用するファイルごとにuseで宣言しておきます。

use App\Models\Flight;

allメソッド(全件取得)

モデル名::all()

コントローラーなどで全件取得して、blade側でforeachでまわせば全件取得できます。

$flights = Flight::all();

return view('/index',[
  'flights' => $flights,
]);
foreach ($flights as $flight) {
    echo $flight->name;
}

findメソッド(主キーで指定したレコードを取得)

モデル名::find(主キー)

主キー(id)で指定したレコードを取得できます。

複数のレコードを取得することも出来ます。その場合、戻り値はコレクションになります。

Flight::find(1); // 主キーが 1 のレコードを取得
Flight::find([1, 2, 3]); // 主キーが 1と2と3 のレコードを取得

whereメソッド(条件にマッチしたレコードを抽出)

Flight::where(条件)

条件を付けたい場合はwhereメソッドを使います。whereメソッドで抽出したレコードをgetメソッドで取得します。

Flight::where('active', 1)->get();

getメソッド(結果を取得)

Flight::where('active', 1)->get();

allメソッドやfindメソッドなどは結果を取得できますが、制約を付け加えたとき結果を取得するためにgetメソッドを使用します。

firstメソッド(最初のレコードを取得)

Flight::where('number', 'FR 900')->first();

countメソッド(レコードの集計)

->count()

sum max minなど、その他の集計メソッドも使用することもできます。

Flight::where('active', 1)->count();
Flight::where('active', 1)->max('price');

destroyメソッド(主キー指定でレコード削除)

主キーがわかっている場合に、主キーを指定して削除ができます。

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

deleteメソッド(条件指定でレコード削除)

->delete()

削除したい制約をつけて呼び出します。

Flight::find(1)->delete();

saveメソッド(レコードの追加)

モデルから新しいレコードを作成するには新しいインスタンスを作成し、saveメソッドを呼び出します。

public function store(Request $request)
{
  $flight = new Flight;
  $flight->name = $request->name;
  $flight->save();
}

RequestとはLaravelの機能で、GETやPOSTリクエストなどで受け取ったパラメータを含んだデータです。

この場合、nameパラメーターをApp\Flightモデルインスタンスのname属性に代入しsave()メソッドで保存しています。

saveが呼び出された時にcreated_atとupdated_atのタイムスタンプは自動的に設定されるので、ここでわざわざ設定する必要はありません。

ソフトデリート(論理削除)

物理削除ではなく、論理削除をします。

bonoponz.hatenablog.com

ソフトデリートするための準備をします。

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Flight extends Model
{
    use SoftDeletes;
}

論理削除になるので削除される日時を指定するため、DBのテーブルにdeleted_atカラムを追加する必要があります。

Schema::table('flights', function (Blueprint $table) {
    $table->softDeletes();
});

これで、deleteメソッドを使用すれば、deleted_atカラムに現在時刻が挿入されます。モデル取得時も、deleted_atがNULLでなければ、クエリ結果に含まれなせん。

また、ソフトデリートされたモデルに対しクエリがあっても、削除済みのモデルはクエリ結果に含まれません。検索に含めるためにはtrashedメソッドを使います。

さらに詳しく記事にしました。

bonoponz.hatenablog.com

まだまだ

Eloquentのおかげで本当に簡単にかけていいですね。

他にもメソッドがあるので、都度調べて使えるようになりたいです。

参考URL

Eloquent:利用の開始 7.x Laravel

Eloquentについて - Laravel学習帳

Laravelのソフトデリートについてメモ - Qiita