LaravelでEloquentの使い方(更新・追加・取得・削除)

Laravel Laravel

LaravelでEloquentを使用する方法と、DB操作の基本のデータの更新・追加・取得・削除について書いています。

本記事では、実際に簡単なモデルを作成して、更新・追加・取得・削除を確認してみます。
最初にモデルとマイグレーションファイルを作成してEloquentを使う準備をします。

そのあとに実際に使用して、動作を確認します。

Laravelのバージョンは8で、動作確認しています。

LaravelのEloquentとは

LaravelのEloquentとは、Laravelで使える標準のORマッパーです。

ORマッパー/ORM(Object-relational mapping)はデータベースをプログラムから使っていくときに、データの取得や追加更・新などを簡単に行えるような機能になります。

実際に使ってみた方が理解できます、実際に使って動作を確認してみましょう。

Eloquentを使ってみる(Modelを作成する)

Fruitテーブルを作成して、Eloquentを使用してデータ操作をしてみます。

下記のコマンドで、FruitテーブルにアクセスするFruitモデルを作成します。
–migrationをオプションをつけることで、fruitsテーブルのマイグレーションファイルの作成をしてくれます。

php artisan make:model Fruit --migration

コマンドを実行すると、このように表示されます。

$ php artisan make:model Fruit --migration
Model created successfully.
Created Migration: 2020_10_07_003725_create_fruits_table

作成したマイグレーションファイルを確認・修正する

作成されたマイグレーションファイルは、下記のようになっています。

database/migrations配下に[日付]_create_fruits_table.phpで、ファイルが作成されます。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateFruitsTable extends Migration
{
    /** 
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {   
        Schema::create('fruits', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        }); 
    }   

    /** 
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {   
        Schema::dropIfExists('fruits');
    }   
}

upメソッドがmigrateをしたときに動いて、テーブルを作成してくれます。
downメソッドはrollbackをしたときに動いて、テーブルを削除します。

初期ではidとtimestampしかないので、テーブルを修正してカラムを追加します。

マイグレーションファイルを修正する

upメソッドを下記のように修正しました。
名前(name)・色(color)・価格(price)のカラムを増やしてみました。

Schema::create('fruits', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('color');
    $table->integer('price');
    $table->timestamps();
});

修正したマイグレーションファイルを適用する

このコマンドで適用します。

$ php artisan migrate

実行すると、こうなります。

$ php artisan migrate
Migrating: 2020_10_07_003725_create_fruits_table
Migrated:  2020_10_07_003725_create_fruits_table (0.96ms)

作成したモデルを確認・修正する

作成したモデルを確認すると、下記のようになっています。

app/Models/Fruit.php

<?php

namespace App\Models;          

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

class Fruit extends Model      
{ 
    use HasFactory;
}  

モデルファイルの修正

$filterableを設定して、データが登録できるようにします。
$filterableを設定する内容は、データをユーザーが入れていいカラムを指定します。

下記のように修正しました。

class Fruit extends Model      
{ 
    use HasFactory;
    protected $fillable = ['name', 'color', 'price'];
}

Eloquentで追加(インサート)する

作成したモデルを使って、Eloquentでデータの追加を試します。

データを追加(インサート)する方法は、2種類あります。

modelのsaveメソッドで追加(インサート)する

modelをnewした後に、それぞれのプロパティに値を設定して、saveメソッドを呼び出すことでインサートできます。

public function insert() {
    $fruit = new Fruit();

    $fruit->name = 'grape';
    $fruit->color = 'blue';
    $fruit->price = 320;

    $fruit->save();
}

modelのcrateメソッドで追加(インサート)する

modelのcreateメソッドを呼び出して、引数に渡した内容をインサートします。

記載する行数が少なく見やすいので、通常はこちらを使うといいかと思います。

public function create() {
  Fruit::create([
      'name' => 'apple',
      'color' => 'red',
      'price' => 100
  ]);
}

Eloquentで更新(アップデート)する

作成したモデルを使って、Eloquentでデータの更新(アップデート)を試します。

データを更新(アップデート)する方法は、2種類あります。

modelのsaveメソッドで更新(アップデート)する

modelのデータをひとつ取得した後に、それぞれのプロパティに値を設定して、saveメソッドを呼び出すことで更新(アップデート)できます。

public function updateOne() {
    $fruit = Fruit::find(1);

    $fruit->name = 'アボガド';
    $fruit->color = 'green';
    $fruit->price = 150;

    $fruit->save();
}

modelのupdateメソッドで更新(アップデート)する

modelからwhereでデータを検索して、updateメソッドで更新すると対象のデータが全て更新されます。

見やすくて書きやすいので、更新も通常はこちらを使うほうがいいと思います。

public  function updateAll() {
    Fruit::where('name', '!=', 'null')->update([
        'name' => 'banana',
        'color' => 'yellow',
        'price' => '200',
    ]);
}

Eloquentで取得(セレクト)する

作成したモデルを使って、Eloquentでデータの取得(セレクト)を試します。

下記のデータがテーブルに存在する状態で試してみます。

id name color price
4 grape blue 320
5 apple red 100
6 grape blue 320
7 apple red 100
8 banana yellow 130

findメソッドを使用して、取得する

findメソッドを使って検索すると、主キー(id)の値が作成されたModelのインスタンスで返ってきます。

$apple = Fruit::find(5);

$appleに返ってきているのは、値が格納されたModelのインスタンス。
ddで表示すると、下記のような状態です。

App\Models\Fruit {#1216 ▼
  #fillable: array:3 [▶]
  #connection: "sqlite"
  #table: "fruits"
  #primaryKey: "id"
  #keyType: "int"
----- 省略 ----- 

toArrayメソッドで配列が取得できます。
ddで表示させると、下記のようになります。

dd($apple->toArray());
↓
array:6 [▼
  "id" => 5
  "name" => "apple"
  "color" => "red"
  "price" => "100"
  "created_at" => "2020-10-08T05:28:37.000000Z"
  "updated_at" => "2020-10-08T05:28:37.000000Z"
]

firstメソッドを使用して、取得する

firstメソッドを使うと、複数あった場合は最初の1件のみ取得できます。
条件にあう値がなかった場合は、nullになります。

$banana = Fruit::where('name', '=', 'banana')->first();

findと同じように、Modelのインスタンスが返ってきます。
結果をddで表示させると下記のようになります。

dd($banana->toArray());

array:6 [▼
  "id" => 8
  "name" => "banana"
  "color" => "yellow"
  "price" => "130"
  "created_at" => null
  "updated_at" => null
]

findOrFailメソッドを使用して、取得する

findOrFailメソッドを使って検索すると、主キー(id)の値が作成されたModelのインスタンスで返ってきます。
findメソッドと違うのは、値が取得できない場合はException(例外)を投げます。

使いどころとしては絶対にあるはずのデータで、なかったらエラーにしたほうがいい場合は、これを使う感じですね。

$grape = Fruit::findOrFail(6);
array:6 [▼
  "id" => 6
  "name" => "grape"
  "color" => "blue"
  "price" => "320"
  "created_at" => "2020-10-12T05:11:07.000000Z"
  "updated_at" => "2020-10-12T05:11:07.000000Z"
]

getメソッドを使用して、取得する

getメソッドを使うと、whereなどの条件で紐付けたデータを複数取得します。

$grapes = Fruit::where('name', '=', 'grape')->get();

データはCollectionに格納されて、返ってきます。
ddで表示すると下記のような感じです。

Illuminate\Database\Eloquent\Collection {#967 ▼
  #items: array:2 [▶]
}

CollectionをtoArray()して確認すると、下記のようにデータが出力されています。

[
  0 => array:6 [▼
    "id" => 4
    "name" => "grape"
    "color" => "blue"
    "price" => "320"
    "created_at" => "2020-10-08T05:24:35.000000Z"
    "updated_at" => "2020-10-08T05:24:35.000000Z"
  ]
  1 => array:6 [▼
    "id" => 6
    "name" => "grape"
    "color" => "blue"
    "price" => "320"
    "created_at" => "2020-10-12T05:11:07.000000Z"
    "updated_at" => "2020-10-12T05:11:07.000000Z"
  ]
]

Eloquentで削除(デリート)する

作成したモデルを使って、Eloquentでデータの削除(デリート)を試します。
Modelインスタンスのdeleteメソッドを呼べば削除されます。

削除できた場合はtrueが返ってきます。

idが5のappleを取得して、削除する場合はこのようになります。

Fruit::find(5)->delete();

findOrFailでもデータが取得できれば、deleteが呼べます。

Fruit::findOrFail(7)->delete();

複数削除する場合は、下記のようにwhereで絞った後にdeleteメソッドを呼びます。

Fruit::where('name', '=', 'grape')->delete();

論理削除する方法は、こちらにまとめました。

終わりに

Eloquentの基本的な使い始め方と、実際に使用した場合の例を書いてみました。

SQLを実行するよりも簡単にデータベースの操作ができますね。
Laravelを使う利点のひとつだと思います。

今回は書いていませんが、他にもサブクエリを書いたり、他のテーブルをjoinしたりもできます。

コメント

タイトルとURLをコピーしました