Laravel Eloquent 調べてみた

Eloquentとは

EloquentとはLaravelのORMです。

データベースとモデルを紐付けてデータの作成や更新など、様々な操作をモデルを利用して行うことができます。

このモデルのことをEloquentモデルといいます。

 

モデルクラスの作成

Eloquentモデルクラスは、以下コマンドを用いて作成することができます。

php artisan make:model ファイル名

App/Models内にファイルが作成されます。

基本的にファイル名は自由なのですが、紐付けるテーブル名の単数形にすることでファイル作成時にテーブルと紐づいたクラスを作成することができます。

例えば、programsテーブルと紐付けたクラスを作成したい場合は、以下コマンドを実行します。

php artisan make:model Program

 

モデルクラスの編集

作成されたモデル例は以下になります。

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Program extends Model
{
 use HasFactory;
}

この場合、もしDBにprogramsテーブルがあれば自動的に紐づくことになります。

テーブルとの紐付け

明示的にテーブルと紐づけたい場合は、以下コードをクラス内に記載します。

protected $table = 'テーブル名';

プライマリキーの設定

デフォルトでは「id」がプライマリキーとして設定されています。

明示的に設定したい場合は、以下コードをクラス内に記載します。

protected $primarykey = 'カラム名';

タイムスタンプの設定

デフォルトでは、登録日時として「created_at」カラムが、更新日時として「updated_at」カラムがテーブル内に設定されます。

タイプスタンプを無効にしたい場合は、以下コードをクラス内に記載します。

$protected $timestamps = false;

カラムの設定権限

eloquentモデルでは、脆弱性対策のため編集できるカラムを設定できます。

以下コードは、ホワイトリスト方式で編集可能なカラムを配列で設定します。

ここで設定された値以外は任意での更新などの操作ができなくなります。

protected $fillable = [
  'name',
  'corner'
]

ホワイトリスト方式に対して、編集を許可しないカラムを明示的に指定するブラックリスト方式での指定方法もあります。

以下コード例になります。

ここで設定された値は任意での更新などの操作ができなくなります。

protected $guarded = [
  'id',
]

なお、ホワイトリスト方式とブラックリスト方式は同時に設定することができません。

プライマリキーのオートインクリメント設定

プライマリキーがオートインクリメントするかどうかの設定ができます。

デフォルトでは、オートインクリメントするようになっています。

これをオートインクリメントしないようにするには、以下コードをクラス内に記載します。

protected $incrementing = false;

特定のカラムに対しての編集

eloquentモデルで、特定のカラムに対して必ず行う設定を記載することができます。

値の取得時に実行する処理をアクセサ、値の登録時に実行する処理をミューテータといいます。

アクセスはgetカラム名Attributeメソッドを、ミューテータはsetカラム名Attributeメソッドをクラス内に記述することで設定ができます。

以下例では、値の取得時に金額のカンマを付与し、登録時にカンマを排除する処理を実行しています。

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Program extends Model
{
 use HasFactory;

 public function getPriceAttribute($value)
 {
   return number_format($value);
 }

 public function setPriceAttribute($value)
 {
   return str_replace(',', '', $value);
 }
}

理論削除の設定

理論削除とは、データを削除する際に物理的に削除をするのではなく、削除されたものとしてデータを保存することです。

理論削除されたデータは、後ほど紹介するデータ一覧取得などでは取得することができなくなっています。

ちなみに、物理的にデータそのものを削除することを文字通り物理削除といいます。

理論削除を有効にする設定もeloquentモデルで設定することができます。

その前に、理論削除のデータを管理する「deleted_at」カラムが該当のテーブル内に必要になるので、マイグレーションなどであらかじめ設定してください。

マイグレーションの場合は、$this->softDeletes()を使用すると作成することができます。

※マイグレーションに関してはこちらを参照ください。

Laravel マイグレーション 調べてみた

カラムの追加ができたら、eloquentモデルを以下のように追記します。

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; ・・・①

class Program extends Model
{
 use HasFactory;
 use SoftDeletes; ・・・②
}

①と②を追記します。

 

eloquentを用いたデータの操作

eloquentモデルを用いたデータベースの操作をCRUDに沿って紹介していきます。

なお、これからの例ではすべてuse App\Models\Programが記述されているものとします。

データの登録

データの登録方法は、createメソッドを使う方法とsaveメソッドを使う方法の2通りがあります。

以下は、createメソッドを使用した方法です。

Program::create([ 
 'name' => 'オードリーのオールナイトニッポン',
 'corner' => 'しんやめ'
]);

createメソッド内に配列で登録したい値を設定します。

次は、saveメソッドを使用した例です。

$program = New Program();
$program->name = 'オードリーのオールナイトニッポン';
$program->corner = 'しんやめ';
$program->save();

クラスからインスタンスを作成し、そこに値を入れていきます。

最後にsaveメソッドを実行し、値を登録します。

 

データの取得

テーブル内の全レコードを取得するには、allメソッドが使用できます。

レコードがCollectionクラスとして返されます。

foreachなどでレコード1つ1つを処理することができます。

以下使用例になります。

$programs = Program::all();

プライマリキーによるレコードの取得には、findメソッドが使用できます。

引数に取得したいプライマリキーを指定することで、Modelクラスとして取得できます。

以下使用例になります。

$program = Program::find(2);

条件検索で値を取得したい場合は、whereメソッドが使用できます。

第1引数に該当のカラム、第2引数に検索したい値を指定することで、Collectionクラスとして取得できます。

以下使用例になります。

$program = Program::where('name', 'オードリーのオールナイトニッポン');

ここで紹介した以外にも使用できるメソッドはたくさんあるので、公式ドキュメントを参照ください。

 

ちなみに、Collectionメソッドでは使用できる便利なメソッドがあります。

例えば、countメソッドはデータの件数を取得することができます。

興味があったら調べてみてください。

 

データの更新

データの更新は、updateメソッドかsaveメソッドで実装する2通りの方法があります。

以下はupdateメソッドで実装した例になります。

$pragram = Program::find(1);
$program->update([
 'name' => '佐久間宣之のオールナイトニッポン0'
]);

更新したいデータを取得して、updateメソッドの引数で更新するデータを渡します。

次は、saveメソッドを使用した例です。

$pragram = Program::find(1); 
$program->name = '佐久間宣之のオールナイトニッポン0';
$program->save();

更新したいデータを取得して、更新したいカラムの値を再代入します。

最後にsaveメソッドを実行します。

 

データの削除

データの削除は、deleteメソッドかdestoryメソッドを使用します。

以下はdeleteメソッドを使用した例です。

$pragram = Program::find(1);
$program->delete();

削除したいデータを取得して、deleteメソッドを実行します。

次は、destoryメソッドを使用した例です。

Program::destory(1);

引数にプライマリキーを指定して、削除することができます。

 

以上!!!!!!!