モデルについて

2019/04/19

一般的にプログラミングにおいてのモデルとは、MVCアーキテクチャの「M」にあたる部分で、データベースとの連携を行う機能を指します。

Laravel におけるモデルは、Eloquent(DB のデータを操作する機能)とビジネスロジックを持ったクラスを指します。

モデルについてきちんと理解していないと、DBを上手く操作することができません。

今回はこのモデルについてエントリーします。

ポイント

Eloquent は「エロクアント」と呼ぶそうです。

Laravel Meetup Tokyo vol.3 に行ってきた!

 

モデルの作成方法

前提として、マイグレーションとシーダーでデータベースにデータが格納されているとします。

 
手順

.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の値をデバッグ
    }
}

また、使用頻度の高いロジックはそのモデル自体にメソッドとして記述しておきます。

そうすることで、使いまわしが楽です。

 
モデルについては以上です。

本庄マサノリ

仕事でLaravelを使っています。気づいたことや新しい発見など情報を発信していきます。メールはこちら

 

-基礎知識