はじめに
今回は前回までに対応したSeederのテストでーたをもとにVueによるデータ取得までの準備を記載する。
Vueによるデータ取得までの準備
環境について
以下で環境を作っている前提とする。
api.phpを使用
一旦jsonデータを表示させる。
フロントがVueなのでweb.phpではなく、api.phpを使用する。
routes/api.php
Route::get('user/{id}', [ApiController::class, 'show']);
urlは以下となる
http://127.0.0.1:8000/api/user/1
routes/api.phpに記述されているルートは基本的にhttp://127.0.0.1:8000/api/
から始まるURLにマッチするようになっている。
コントローラ
実行するコントローラを以下のようにする。
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class ApiController extends Controller
{
public function show($id)
{
$user = User::with('projects.tasks')->find($id);
if (!$user) {
return response()->json(['message' => 'User not found'], 404);
}
return $user;
}
}
with()メソッドのあるUser::with('projects.tasks')->find($id);の行は、指定したIDのユーザを取得し、同時にそのユーザが所有するプロジェクトと、各プロジェクトが所有するタスクも一緒に取得する。
with()メソッドはLaravelのEloquent ORMにおける「イーガーロード」を行うためのもの。
「イーガーロード」とは、関連するデータを事前にロードすることで、後続の操作で必要なSQLクエリの数を減らすためのテクニック。
例えば、ユーザが所有するプロジェクトを取得し、それぞれのプロジェクトが所有するタスクを取得する場合を考える。これらを通常の方法で取得すると、まずユーザを取得、次にそのユーザのプロジェクトを一つずつ取得、さらに各プロジェクトが持つタスクを一つずつ取得というように、必要なデータの量に応じて多くのSQLクエリが発生する。これは大量のデータを扱う場合にパフォーマンスに影響を及ぼす可能性がある。
それに対しwith('projects.tasks')を使うと、ユーザ、プロジェクト、タスクのデータをそれぞれ1回のクエリで一括して取得する。これによりSQLクエリの数が大幅に減り、パフォーマンスが向上する。
なお、このメソッドを使うためには、関連するモデル間にリレーションシップが定義されている必要があります。この例ではUserモデルはProjectモデルと、ProjectモデルはTaskモデルとそれぞれリレーションシップを持っている必要がある。
jsonデータ表示
http://127.0.0.1:8000/api/user/1
終わりに
今回は大したテーマではないが、長くなったので4回に分けて実施した。
次の開発のステップに進みたい。