💃

[Laravel基礎]"モデル"って何ができるの?

4 min read

はじめに

Laravelでデータベースを操作するときにモデルやらマイグレーションやら触ったものの、あれって何書くのが正解なの?って感じなんですよ。
なので、ここではあらためてモデルとは何なのかを、ざっくり理解していきたいと思います。

そもそも"モデル"って何?

Databaseのデータを操作する機能のこと。
DBのテーブルに対応するモデルがあり、コントローラでそのモデルを操作するとDBに書き込むデータを指定したりできる。
(https://qiita.com/shizen-shin/items/f965a845b4a829ff301d)

へ〜、データベースのデータが操作できるんだ〜。
でも、データ操作って具体的に何ができるの?、って感じですね。

この記事で詳しく何ができるかも含めて見ていきましょう。

事前準備:モデルの作成

説明の前にモデルの雛形となるファイルを作成しちゃいましょう。
今回はusersというテーブルを作成することを前提に作成を進めます。
ファイルの作成を行うコマンドには以下のものがあります。

# 基本
# appディレクトリ直下にファイルが作成されます。
$ php artisan make:model User

# パスを指定
# app\Modelsにファイルが作成されます。
$ php artisan make:model Models/User

# 一緒にマイグレーションファイルも作る場合
$ php artisan make:model User --migration
$ php artisan make:model User -m

Laravel の Model には命名規則があります。
テーブル名を 単数形+アッパーキャメル にしたものがモデル名となります。
こうすることで、自動的にテーブル操作ができるようになります。
例えば、テーブル名が users の場合、モデル名は User になります。

今回マイグレーションについては詳しく触れませんが、データベースの設計書のようなもので、モデルと一緒に作成することが多いです。
私はマイグレーションファイルも作りつつ、モデルはapp\Modelsフォルダに作成したいので以下のコマンドで作成することが多いかな。

$ php artisan make:model Models/User -m

"Model created successfully."という表示が出たらモデルの雛形ファイルの作成は完了です。
app\ModelsフォルダをみるとUser.phpgというファイルができていると思います。

中身はこんな感じ。

app\Models\User.php
<?php

namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class User extends Model
{
  //
}

"//"のところに内容を書いていきます。

1.割り当て許可の設定

では早速できることの1つ目。割り当て許可の設定です。
モデルはデータベースのデータを操作するものと言っていましたが、そのためにはあらかじめ、値を操作するレコードに割り当て許可の設定をしておく必要があります。
この項目は後で操作するから値の変更を許可しておくよ〜、的なことです。

ではUserというデータベースを例に見ていきましょう。
このデータベースには以下のテーブルを用意する予定です。

  • id
  • year
  • name
  • email
  • address
  • tell

このうち id/year の2つはデータの操作は行わないようにしたいと思います。

割り当て許可の方法はブラックリスト方式とホワイトリスト方式があります。
それぞれの方法について見ていきましょう。

ブラックリスト方式

ブラックリスト方式は $guarded(保護)を使って割り当て許可を与えたくない要素を指定します。
今回の場合指定するのはid/yearの3つの要素です。
下記のように $guarded 変数に配列を設定した上で protected すれば、「id」と「year」以外の要素を、create関数等を使ってデータを渡すことができる設定となります。

class User extends Model
{
  protected $guarded = ['id', 'year'];
}

ホワイトリスト方式

ホワイトリスト方式は逆に、$fillable(代入可能)を使って割り当て許可を与えたい要素を指定します。
割り当て許可を与えたい要素が少ないなら、こちらを利用すべきでしょう。
今回の場合指定するのは name/email/address/tell の4つの要素です。

下記のように $fillableに配列を設定した上でprotectedすれば、「名前」「email」「住所」「電話番号」のみ書き換えることができます。

class User extends Model
{
  $fillable = ['name', 'email', 'address', 'tell']; 
}

ホワイトリスト方式のfillable と ブラックリスト方式のguarded の設定はどちらか一方のみ可能です。
両者の属性を両方同時に設定することはできません。

2.デフォルト以外の設定

よく使われるプロパティを紹介しておきます。

プロパティ 説明 規定値
$connection どのDB接続するのか。onメソッドで動的に変
$table どのtableに対して処理するのか モデル名の複数形
$primaryKey 主キーの設定 id
$incrementing 主キーをオートインクリメントするかどうか true
$timestamps テーブルの作成、更新日時を自動更新 true
$fillable 渡した属性を複数代入させるかどうか(columnに値を入れたい場合必須) null

ん〜...、ちょっとこれだけじゃ分からないので実際の例も見てみよう。

テーブル名を変更したい

「User.php」というモデルを作成した場合、操作されるテーブルは「users」になります。
このルールを変更したい場合は、モデルに以下のように記述します。

# User.php
# 'user_admins'テーブルにマッピングされる
protected $table = 'user_admins';

プライマリーキーを変更したい

デーブルのプライマリキー(主キー)はデフォルトでは「id」となっています。
これを別の主キーに変更したい場合は、モデルに以下のように記述します。

# User.php
# 'user_id'というカラムが主キーになる
protected $primaryKey = 'user_id';

なるほど、プロパティを使って色々設定できるってことだね。

まとめ

  • "モデルとは"Databaseのデータを操作する機能のこと
  • 必ず設定するのは割り当て許可の設定
  • ブラックリスト方式かホワイトリスト方式を使って書くよ
  • その他にもプロパティを使ってデータの操作を行うことができる

うん、ざっくりは理解できた気がする。

また余談ですが、Laravelではレコードの出し入れをする際、コントローラにその操作を記述するんだけど、
この際も上の表と同じプロパティが使われます。
ただ今回はモデルに関する記事なので、その話はまた別の機会にしたいと思います。

*参考

Discussion

ログインするとコメントできます