【Laravel】Eloquent(エロクアント)の使い方やモデルとの紐付け方法
この記事からわかること
- Laravelのデータベース操作機能
- Eloquent(エロクアント)の初期設定方法
- Eloquent(エロクアント)の使い方
- ORMやモデルの意味
- モデルとデータベースの紐付け方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Laravelにおけるデータベース操作機能の1つ「Eloquent(エロクアント)」の使い方とメリット、初期設定の方法からCRUDの記述方法などまとめていきたいと思います。
参考記事:公式:Eloquent(エロクアント)
Eloquent(エロクアント)とは?
Laravelでデータベースを操作できるDBクラス(クエリビルダ)ではデータベース操作を通常通りのSQL文やメソッドを繋ぎ合わせて操作できますがPHPで記述しているのにSQL文を意識しないと扱うことができません。
一方Eloquent(エロクアント)はデータベース操作をPHPのクラスを扱うように操作することができます。これはEloquent(エロクアント)がORM(Object-Relational Mapping)の仕組みに準じて作られているからです。
ORM(Object-Relational Mapping)とはDBとプログラミング言語の非互換性を吸収してあたかも互換性があるかのようにやり取りできるようにする仕組みの総称。
Eloquent(エロクアント)はデータベースのテーブルをモデルと呼ばれるクラスとして扱います。
おすすめ記事:【PHP】class(クラス)の使い方とは?変数やメソッド、インスタンスの意味
Eloquent(エロクアント)〜まとめ〜
- Eloquent(エロクアント)はORMの一種
- ORMとは互換性のないもの同士を繋げる仕組み
- DBクラス(クエリビルダ)とは違いSQL不要
- PHPのクラスとしてDBが定義
Eloquent(エロクアント)の使い方
使用可能にする流れ
- モデルの作成
- use文で読み込み
- 使用可能
DBクラス(クエリビルダ)の場合はデータベース接続設定さえ済んでいれば前準備は不要でuse文を組み込むだけで使用できました。しかしEloquent(エロクアント)ではまずはモデルの作成が必須になります。
モデルの生成と追加オプション
まずはモデルを定義するスクリプトファイルをartisanコマンド
で生成します。これで「app」>「Models」内に「モデル名.php」ファイルが作成されます。
$ php artisan make:model モデル名
// 引数にオプションを指定可能 マイグレーションやコントローラーを同時作成
$ php artisan make:model モデル名 --migration
$ php artisan make:model モデル名 --controller
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class モデル名 extends Model
{
use HasFactory;
}
DBテーブルとの紐付けとモデル名の命名規則
Eloquent(エロクアント)ではデータベーステーブルと作成したモデルの紐付けを名前から自動で紐付けしてくれます。そのためには両者の名称が命名規則に則っていることが必須になります。
モデル名の命名規則
- テーブル名の単数形の名称
- アッパーキャメルケース
または
対応したDBテーブル名の命名規則
- モデル名の複数形の名称
- スネークケース
または
例
モデル名 | テーブル名 |
---|---|
Post | posts |
User | users |
MenuName | menu_names |
PersonalAccessToken | personal_access_tokens |
Person | people |
テーブル名が一単語であれば複数形の「s
」無し先頭大文字
スネークケース(単語区切りを_で繋いだ命名規則)の場合は「s
」無しのアッパーキャメルケース(単語の先頭を大文字にする命名規則)
またこの規則から外れて英単語自体が単数複数を表す関係のものであっても自動紐付けしてくれるようです。
命名規則を無視してモデルとテーブルを紐付ける
時には複数形/単数形の縛りから外れた名前をつけることもあります。その際は命名規則を無視して、自分で明示的に紐づけるテーブルを指定することもできます。
方法は簡単で「app」>「Models」内に作成された「モデル名.php」ファイルに以下のように$table
プロパティを追加して紐付るテーブル名を指定するだけです。
class モデル名 extends Model
{
use HasFactory;
// 追加
protected $table = '紐付けたいテーブル名';
}
コントローラからデータベースを操作する
作成したモデルを使用するにはコントローラ上部にuse文
で読み込みをしておきます。
use App\Models\モデル名;
これでモデルを介してデータベース操作が可能になりました。使用するには以下のようにモデル名::メソッド
のような形式で操作していきます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
class modelsController extends Controller{
public function index(Request $request)
{
$records = User::all();
return view('index', ['users' => $records]);
}
}
全レコードを取得できるモデル::all()
の返り値はコレクション形式のモデルクラスのインスタンスです。クエリビルダではコレクション形式の配列の中にオブジェクト形式(stdClass)でレコードデータを格納された状態で返すので大きな違いはココでもあります。
モデルの返り値
$records = Users::all();
var_dump($records);
// 結果:object(Illuminate\Database\Eloquent\Collection)#328 (2) { ["items":protected]=> array(46) { [0]=> object(App\Models\.....
クエリビルダの返り値
$records = DB::table('テーブル名')->get();
var_dump($records);
// 結果:object(Illuminate\Support\Collection)#277 (2) { ["items":protected]=> array(1) { [0]=> object(stdClass)#279....
また同じコレクション形式ですが定義されている名前空間は別の場所になっています。
モデルクラスであるメリット
オブジェクト(いわゆる連想配列)ではなくモデルクラスインスタンスで返されるメリットは拡張性の高さです。phpのクラスは自由にプロパティやメソッドを追加することでクラス自体に独自の機能や仕組みを簡単に増やすことができました。
モデルクラスも同様に独自のメソッドなどを定義できます。またモデルクラスの中のプロパティには内部的にテーブルのカラムが定義づけられています。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
use HasFactory;
protected $table = 'users';
// イメージ(実際の記述はありません)
public $id = "値";
public $name = "値";
public $column = "値";
// イメージ(実際の記述はありません)
// 独自のメソッドを定義できる
public function getProfile() {
return 'このユーザの名前は'.$this->name.'です';
}
}
プロパティに各カラムが定義づけられているのでメソッド内では$this->カラム名の形式
でその値にアクセスできます。bladeテンプレート側ではforeach
で回した変数などからメソッドを呼び出すことができます。viewに変数を渡すのは忘れないようにしましょう。
return view('index', ['users' => $records]);
index.blade.php
<body>
<h1>Index</h1>
@foreach ($users as $user)
<p>{{$user->id}}</p>
<p>{{$user->getProfile()}}</p>
@endforeach
</body>
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。