2022/05/02
一般的にプログラミングにおいてのモデルとは、MVCアーキテクチャの「M」にあたる部分で、データベースとの連携を行う機能を指します。
Laravel におけるモデルは、Eloquent(DB のデータを操作する機能)とビジネスロジックを持ったクラスを指します。
モデルについてきちんと理解していないと、DBを上手く操作することができません。
今回はこのモデルについてエントリーします。
Eloquent は「エロクアント」と呼ぶそうです。
モデルの作成方法
前提として、マイグレーションとシーダーでデータベースにデータが格納されているとします。
手順
.envファイルの作成
モデルを作成する前に .envファイルの設定をします。
以下のようにデータベースのホスト、データベース名、ユーザ名、パスワードを入力してデータベースの設定をします。
#.env
DB_HOST = {ホスト名}
DB_DATABASE = {データベース名}
DB_USERNAME = {ユーザ名}
DB_PASSWORD = {パスワード}
:
実際にはデータベースの設定は config/database.php から読み込まれています。
# config/database.php
'host' => env('DB_HOST', '127.0.0.1'),
:
上記の場合、.env に DB_HOST があれば.env側の値が使われます。
なければ、デフォルトの127.0.0.1が使われます。
.envに書く理由はローカルと本番環境とで設定を変えるためです。
モデルのひな形を作成
モデルのひな形の作成はartisanコマンドで作成できます。
# 基本
# 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 になります。
割り当て許可の設定
Eloqunet モデルを使って create するときに、何も設定していないと MassAssignmentException というエラーが出ます。
これは Eloquent で Mass Assignment(割り当て許可)の設定をしていないからです。
Eloquent の create で割り当てようとする値は、あらかじめ Eloqunet 側で割り当て許可を与えなくてはいけません。
割り当て許可の方法はブラックリスト方式とホワイトリスト方式があります。
ブラックリスト方式
ブラックリスト方式は $guarded(保護)を使います。
下記のように $guarded 変数に配列を設定した上で protected すれば、「id」と「year」以外の要素を、create から渡すことができます。
:
class User extends Model{
protected $guarded = ['id', 'year'];
}
:
ホワイトリスト方式
割り当て許可を与えたい要素が少ないなら、ホワイトリスト方式もあります。
下記のように $fillable(代入可能)に配列を設定した上でprotectedすれば、「名前」「email」「住所」「電話番号」のみ書き換えることができます。
:
class User extends Model
{
$fillable = ['name', 'email', 'address', 'tel'];
}
:
fillable と guarded の設定はどちらか一方のみです。
両者の属性を両方同時に設定することはできません。
デフォルト以外の設定
テーブル名を変更したい
「User.php」というモデルを作成した場合、マッピングされるテーブルは「users」になります。
このルールを変更したい場合は、モデルに以下のように記述します。
# User.php
# 'user_admins'テーブルにマッピングされる
protected $table = 'user_admins';
プライマリーキーを変更したい
デフォルトでは「id」がプライマリーキー(主キー)となっています。
別の主キーに変更したい場合は、モデルに以下のように記述します。
# User.php
# 'user_id'というカラムが主キーになる
protected $primaryKey = 'user_id';
Eloquentを使ってモデルを操作
モデルを使ったデータベースの操作はコントローラに記述します。
クエリービルダーを使って操作・抽出します。
:
use App\User; //Userモデルを呼び出す
class UserController extends Controller
{
public function index()
{
$user = User::where('name','テスト')->firstOrFail();
dd($user->name); // nameの値をデバッグ
}
}
また、使用頻度の高いロジックはそのモデル自体にメソッドとして記述しておきます。
そうすることで、使いまわしが楽です。
モデルについては以上です。
PHPフレームワーク Laravel入門 第2版
僕がはじめてLaravelを学習するために参考にしたサイトは、掌田津耶乃(しょうだつやの)さんの libro というサイトです。当時(2016年)、Laravel学習サイトの中でもこのサイトは群を抜いてわかりやすく説明されていたので、とても勉強になったのを覚えています。この本は掌田津耶乃さんが書いた本なので、わかりやすく解説されているだろうと kindle で購入しました。2020年8月の時点でいうと日本国内にて唯一の Laravel の良書と言っても良いかと思います。口コミでもLaravel本のロングセラー定番解説書として認知されています。当サイトではチュートリアル形式でLaravelを解説しているので、初心者の方はこの本とセットで学習されるといいと思います。しかし、かなりわかりやすく解説されているとはいえ、PHP中級者以上のスキルは必要です。PHP自体の知識が乏しい方は 独習PHP 第3版 をあわせて購入することをお勧めします。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。