Laravel Eloquentモデルを使ってデータを取得して、viewに表示してみる
前回はtinerを使って、DBに接続してデータを取得しました。
今回は、プログラムコードを記述してデータを取得して、viewに表示してみるということを行っていきましょう。
データを取得するにはEloquentモデルというものを使います。序盤に説明していたモデルとはこのことを指しています。(https://implist.dev/entries/17b6a921036f86354f4fe01dec99808b)
「 Laravelのルーティングからコントローラを呼出し、値をビューに渡す」という記事で値をビューで表示するということを行っているので、データさえ取得できれば、あとは簡単ですね。
※テーブルやデータは前回の内容を使っているので作成していない方は、usersテーブルを作成して、データをinsertしておいてください。
特定のユーザーを取得して表示してみる
まずはidが1のユーザーを取得して、viewに表示していきます。
新しいルーティングとviewを作成してデータを表示の準備
まずは、ルーティングとviewファイルを用意しておきましょう。これは今まで学習してきた内容ですね。
routes/web.php
<?php
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;
Route::get('/users', [UserController::class, 'getUser']);
resources/views/users/index.blade.php
<div>
hello {{ $user->name }}
</div>
モデルクラスの作成
app/Models/User.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
/**
* @mixin Builder
*/class User extends Model
{
}
まずはモデルクラスを作成します。これが必要な理由は、このクラスを通してDBと接続してデータを取得できるからです。Modelというクラスをextendsするだけで、いろいろなメソッドが使えるようになり、なおかつDBと接続してうまい具合に求めるデータを取得することができます。
クラスの命名には注意が必要で、DBにusersというテーブルがあり、このデータが欲しいとするとクラス名はUserにする必要があります。英語は単数形であることに注意です。
このようにDBのテーブルやPHPのクラス名なのをLaravelのルールに従って作成するとこで、データ取得の処理をうまい具合に処理してくれます。
更に詳しい説明はここを参照してください。
https://prograshi.com/framework/laravel/model-eloquent-and-query-builder/
コントローラでモデルを使ってデータ取得
app/Http/Controllers/UserController.php
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\View\View;
class UserController extends Controller
{
public function getUser(): View
{
$user = User::find(1);
return view("users/index", ["user" => $user]);
}
}
controller内でmodelを使ってデータ取得を取得するコードはあまり良くないですが、今回は簡単に説明したいためcontrollerからモデルを呼ぶことにします。実際はrepositoryとかDaoというようなクラスを作って、データの取得はそこだけで行うようにしたりするのが良いです。
https://zakkuri.life/laravel-repository/#Controller
repositoryというものを用いるのがなぜ良いのかは、こちらの記事の序盤で取り上げられているので、参照ください。
上記のコードで重要なのは、
$user = User::find(1);
という部分ですね。先程作成したUserクラスのfindメソッドに1という引数を渡して、呼び出しています。
これの意味するところは、「usersテーブルのidが1のデータを取得する」というものです。
今回はid(primary key)を指定して1件だけ取得するという内容ですが、この他にも、
- テーブルの全てのデータを取得する(all)
- 特定条件で複数データ取得する(where)
- 複数のテーブルを結合させて複数データを取得する(join)
などが存在します。
このようにデータの操作クラスであるこのUserクラスなどは、LaravelではEloquentモデルと呼ばれます。また、このようなEloquentモデルを総称して一般的にはORマッパーと呼ばれています。
Eloquentには、他にもたくさんのデータ取得メソッドが用意されているので、詳しくはこちらを参照ください。
https://readouble.com/laravel/9.x/ja/eloquent.html
ちょっとここで$userに入ってるデータをプロットしてみましょう。
dd()というlaravel付属の関数を使用すると、どういうデータがどのような形式で変数に入っているのかを見やすく閲覧することができます。
dd($user);
このように記述して、アクセスすると
attributesというところに、取得したいデータがはいっています。ちゃんとデータが取得されている事がわかりますね。dd()は便利なので、覚えておくとよいです。
では、dd()の部分はもとに戻して、アクセスしてみます。
ちゃんとDBに入っているtakeshiというデータが表示されていますね。
年齢も取得できているはずなのでviewをいじって表示させます。
resources/views/users/index.blade.php
<div>
hello {{ $user->name }}, 年齢は {{ $user->age }}歳です。
</div>
ちゃんと年齢も取得できました。
全ユーザの取得と表示
次は全ユーザを取得して表示していましょう。
今はデータが1件しか入っていないので、複数件データ追加しておきます。
INSERT INTO `myapp`.`users` (`name`, `age`) VALUES ('mitsuru', 23);
INSERT INTO `myapp`.`users` (`name`, `age`) VALUES ('miho', 60);
INSERT INTO `myapp`.`users` (`name`, `age`) VALUES ('arisawa', 40);
INSERT INTO `myapp`.`users` (`name`, `age`) VALUES ('toshio', 50);
INSERT INTO `myapp`.`users` (`name`, `age`) VALUES ('yokoya', 53);
controllerでデータの取得方法を変えていきます。
app/Http/Controllers/UserController.php
public function getUser(): View
{
$users = User::all();
return view("users/index", ["users" => $users]);
}
User::all()とするとusersテーブルの全てのデータが取得できます。複数のデータが入っているので一応変数名とviewに渡す名前をusersにしています。
resources/views/users/index.blade.php
<div>
@foreach($users as $user)
<div>
hello {{ $user->name }}, 年齢は {{ $user->age }}歳です。
</div>
@endforeach
</div>
viewではlaravelのテンプレートエンジンであるbladeの機能、@foreachを使って、$usersをまわしています。
$userにユーザーのデータが1つずつ入っていくので、あとは先程と同様のコードです。divではさんで改行されるようにしてます。
ユーザーが繰り返し表示されていることが確認できました。このように1つだけのデータや複数のデータを取得するのもかなり簡単にできるのでEloquentの他のメソッドも試してみてください。
条件を絞り込んだりすることもできるので、例えば30歳以下の人を取得して表示したり、最近追加された人で直帰3人だけ取得するなんてこともできます。
ひとまずデータの取得はこれで以上にになります。次回ユーザーデータの登録や更新、削除といった操作を行っていきます。
今回はデータ取得のみでしたが、次回の登録・更新・削除をマスターすることで、簡単なアプリケーションなら作れるようになります。
基本的なアプリケーションはCRUDと呼ばれる操作が出来れば、考え方次第で何でも作れますよ。
※CRUDは登録(create)、読込(read)、更新(update)、削除(delete)を意味しています。