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したりもできます。
コメント