Laravel

Laravel Modelの基本設定

Laravelでデータベースを操作するときに、実テーブルのデータをLaravel上で処理しやすいようにオブジェクト化したものが「Model」となります。

Sql文章を書かずに、プログラムとしてデーターベースを操作するための機能の一つで、
LaravelでApiを作成するにしても、実際にデータを操作する場合にはModelが必須です。

たくさん学ぶべき項目はありますが、こちらのページでは基本的な内容についてみていきたいと思います。

Model作成時のコマンド

php artisan make:model Staff

上記がLaravelでModel作成するときの基本的な書き方です。
この書き方をした場合「App¥Http¥Models」配下にModelが作成されます。

テーブル数が少ない場合は問題ないですが、ディレクトリを切って、分けて管理したい場合もあるかと思います。
そのような場合は以下のような書き方をすることでディレクトリを切って作成することができます。

php artisan make:model DatabaseName/Staff

この例ではDatabaseが複数存在し、データベースごとにモデルを分けておく場合を想定して「DatabaseName」ディレクトリ配下にModelを作成することにしました。
実際にはこのようになります。

これでモデルが作成されて、あとはModelの中身を書いていく形になります。

model作成時のオプション

make:modelコマンドにはさまざまなオプションが用意されています。
代表的なものにはこのようなものがあります。

  • --factory(-f)
  • --seed(-s)
  • --controller(-c)

モデル作成時に同時にファクトリや、シーダー、コントローラーなどを作成したい場合は上記オプションを追加することで同時に作成できます。
Laravelの命名規則に沿って作成されますので、後で作成予定があるならオプションも利用してみて下さい。

しかし、コントローラーなどが作成されるディレクトリを指定できない点は注意して下さい。

個人的にはmake:modelコマンドは使わない理由

個人的にmake:modelコマンドは使用していません。
理由は結局コントローラーを作成するので、コントローラー作成時に同時にモデルを作成しているからです。

上記のページで解説しているように、実際には以下のようなコマンドで作成しています。

php artisan make:controller Staff/StaffController --api --model=App/Models/Staff/Staff

何度もコマンドを打たずに、コントローラーとモデルを結びつけたコントローラーとモデルを作成してくれます。

使うのはコントローラーを作成したときにモデルを作り忘れた場合が多いです。

LaravelのModelの命名規則

Laravelではテーブル名と、Modelを結びつけるのですが、命名規則にルールがあります。
※もちろん規則以外にも対応できるようになっています。

項目名ルール命名規則
テーブル名複数形スネークケース
モデル名単数系
アッパーキャメルケース

テーブル名は複数形でスネークケース

テーブル名はスネークケースで書くルールとなっています。

スネークケースは

  • 全て小文字
  • 単語と単語は「_」でつなぐ

となります。

基本的には単語にsをつける

英語で複数形にする場合、単語の最後に「s」をつけるので、基本は「〇〇s」になります。

例えばユーザーを管理するテーブルであれば、テーブル名は「users」となります。

次にユーザーに関連するグループだとすれば「user_groups」のような命名となります。
大事なのが最後の単語が複数形になっているところで、Laravelはそこを自動判別してモデルとテーブルを結びつけるようになっています。

複数形になると語尾が「ies」など変形する場合

少し気になるところが複数形にしたら「ies」になるような単語です。
例えば「factory」を複数にしたら「factories」というような単語についてです。

このような単語については、Laravelが自動で判別してテーブルを結びつけてくれますので、
英語の複数形の使い方に合わせて命名して問題ありません。

その単語自体が複数形な場合(集合名詞)

説明で使用していた「staff」がそうなのですが、この単語自体が複数形を表すものとなっている単語 = 集合名詞が存在します。
例えば「data」「news」「people」など。

集合名詞の場合は「s」をつけても自動でテーブルを判別してくれません
シンプルにそのままの名前のテーブルと結びつけられるようになっています。

staffであればstaff,dataであればdataとそのままとなります。

他の単語とルールが違うのでどのようなルールにするかは使用する組織などに合わせて使用して下さい。

  • ルールを理解した上で使用
    ※テーブル名とモデル名を同じにする
  • 最後に集合名詞を使わない
  • Model定義でテーブルを指定

モデル名はテーブル名を単数系にしアッパーキャメルケース

  • テーブル名を単数系にしたもの
  • アッパーキャメルケースで書く

モデルはテーブル名を単数系にしたものになります。

先ほどテーブル名を考えている時点で単数を考えているかと思いますので、基本的には単数系をモデル名にします。

その単語自体が複数形な場合(集合名詞)

先ほども書いたように「data」「staff」「news」などその単語そのものが単数を示す「集合名詞」である場合だけは注意が必要です。

モデル名は単数に直す必要性はなく、そのまま使用すれば自動でテーブルとの紐付けをしてくれます。
集合名詞のテーブルであればそのまま使用すれば良いかと思います。

Laravelのテーブルなどの命名規則は守る必要があるのか?

  • 新規なら守ったほうが楽
  • すでにあるならわざわざ合わせなくてもOK

Laravelには元々命名規則がありますが、実際に守る必要はありません。
しかし、守っておくと最終的に記述量を減らせるので、可能であれば守る方が良いかとは思います。

とはいえ、既存プロジェクトに導入するとなるとテーブル名などを変更する手間も増えますし、バグが増えたりするのでわざわざ対応したりする必要はないかと思います。

Laravel Modelの基本的な設定内容

ここからは実際にModelの中身に関してみていきます。
詳しくはLaravel公式リファレンスにあるので、全ては書きませんが、よく使用するものについての解説をしていきます。

class内プロパティの修飾子

修飾子内容
publicどこからでもアクセスできる
protectedそのクラス自身と継承クラスからアクセス可能です。非公開ではあるが継承可能。
privateそのクラス内からのみ参照可能、継承不可

$connection

protected $connection = 'databaseName';

モデルが接続するデータベースを指定します。

指定がない場合config¥database.phpにあるdefaultプロパティに指定されているデータベースに接続されるようになっています。
Laravelのプロジェクトに置いてデータベースが一つしかない場合は特に書く必要はありません。

そのテーブルのデータベース接続先が違う場合は「$connection」に書くようにします。

ただし、ここで書くのはModelの規定接続先になるので、使用するときに接続先を変更することもできます

$attributes

  protected $attribute = [
    'name'  => '',
    'type'  => 0,
    'is_ok' => false,
  ];

Laravelでデータ追加するときに、Modelをnewして新規インスタンスを作成します。
そのときに初期でpropertyに入る値を設定できます。

'フィールド名' => 初期値

このように書くことで初期値を設定できます。

テーブル自体に規定値の設定してあるなら不要ではあるのですが「明確に規定値を設定してあげる & Modelを見ればすぐに規定値がわかる」ためにも$attributeに書いてあげるほうが親切といえます。

$hidden

  protected $hidden = [
    'created_at',
    'updated_at',
  ];

Modelをreturnしたときに、表示させないフィールドを設定します。
絶対に返却する必要がない or 内部だけでのみ使用するようなフィールドを設定していきます。

$fillableと$guarded

  protected $fillable = [
      'name',
      'hurigana',
      'email',
  ];

  protected $guarded = [
    'created_at',
    'updated_at',
    'deleted_at',
  ];

このプロパティは1回の記述でcreateやinsertなど、複数フィールドを更新する「一括代入」するときのホワイトリスト($fillable)とブラックリスト($guraded)を設定します。

$guardedと$fillableはどちらか一方しか記述できません。
仮に両方定義されていた場合$fillableが優先されます。

$fillableと$guardedは設定しておくほうが便利

この項目を設定しておくと便利です。
理由としては以下のような書き方ができるからです。

$item = [
  'name' => 'test',
  'email' => 'test@gmail.com',
  'hurigana' => 'てすと',
  '存在しないフィールド' => '存在しないフィールド',
];
Staff::create($item);

例えば上記のようなコードを実行した場合、簡単にinsertやupdateを書けるからです。

上記の$itemに存在しないフィールドが存在しても無視され、guradedに書いておけば勝手に更新されることもありません。
更新可能なフィールドのみ更新してくれるので、手間を減らせます。

$casts

//取得した時に変換が行われる
protected $casts = [
    'type' => 'integer',
]

$castsにはフィールドに対して型を設定でき、値を返却するときの型に合わせた表示でreturnされます。

Laravelで値を取得してApiに返すときに$castsを設定しない場合、すべて文字列としてreturnされます。
特にApi作成している場合文字列で返してしまうと、受け取った側が型変換しないといけないので手間です。

そうならないために$castsを設定します。

// $castを指定していない場合
{"type": "0"}

// $castを指定している場合
{"type": 0}

-Laravel
-,