実践的なアプリの開発の一部の機能をお手伝いしていた時
いつも通り、
「このパターンはここのコントローラーの中身を流用して、こう作る〜これでOK。」
と思っていたが、ふと頭によぎる天の声。
「自分で作ったものは説明できるようにしてくださいね。」
そう思いながら、
「これで動くのはなんとなく分かるけど、なんでだ????」
と思ったのが、下記の部分。
public function create()
{
Gate::authorize('isCompanyUser');
$currentUser = auth()->user();
$omocha = new Omocha();
$branches = $currentUser->branches();
$parts = $currentUser->company->parts();
$manager = $currentUser->company->managers();
return view('omocha.create', compact('omocha', 'branches', 'parts', 'manager'));
}
なんとなく、
- ユーザーに紐づく支店の情報を取っているんだな〜
- ユーザーと同じ会社に紐づくパーツを取っているんだな〜
- ユーザーと同じ会社に紐づくマネージャーさんの情報を取っているんだなー
- その情報を
omocha.create
に渡しているんだな〜
と、理解していた。
では、なぜこれで取得できるのか?
$parts = $currentUser->company->parts();
よくわからなかった。
「あれ? $currentUser->company
って ->
で $currentUser
のメソッドにアクセスしてるんだよね?」
「あれ? $currentUser
ってログインユーザーの情報を保持してるだけじゃないの?」
「メソッドなんてなくない?」
company->parts();
「これでなんで紐づいた値が取れるんだ? テーブルから取得する記述どこだ??」
となってしまった。
結局、すべてGPTと会話しながら解決していったが、長かった。
一番理解できたのは o3-mini-high を利用した時。
感覚的に、「君が知りたい箇所を理解するためには、ここから説明しないとダメなんだ」と教えてくれて、すごく助かった。
それまでは説明系は 4o を利用していた。
なぞるような形で書いていく。
auth()->user();
について
単に「ユーザーのログイン情報を取得している」と思っていた。
-
auth()
だけでユーザー情報を取得可能。 -
auth()
の関数の中身の記載は見つからなかったので、「Laravelが用意した関数なんだろう」と理解。 -
->user()
で現在ログインしている Userモデルのインスタンス を作成する。
クラスはレシピ、インスタンスは料理 だっけ?
すでにここで Userモデルをインスタンス化 していた。
「ああ、そういうことか。」
$currentUser->company
これは、
「Userモデルのcompany
メソッドにアクセスしてくれ!」
という意味だった。
company()
の中身は
return $this->belongsTo(Company::class);
このUserは、 一つのCompanyに紐づいている と定義されている。
つまり、 company()
で $currentUser
に紐づく Companyオブジェクト が取得できる。
そこに対して、さらに ->parts()
とアクセスすることで、
Companyモデルに定義されたメソッドを呼び出している。
return $this->hasMany(Parts::class);
これは、
「このCompanyオブジェクトに紐づく Parts は多数あるよ」
という関係を表している。
なるほど、アクセスの仕組みとリレーションの関係は分かった。
が、
なぜテーブルの情報を持ってきているんだ!?
どこに記述されているんだ!?
それは Eloquent が担っていた。
use Illuminate\Database\Eloquent\Model;
こんな感じで書かれているはず。
この Model を継承 することで、 リレーションの関係やデータの取得が可能 になるとのこと。
つまり、 「この記述があるだけで、関連するデータを自動で取得する」 という仕組みらしい。
SQLの処理はLaravelに 「任せてOK!」 ってことだった。
class 〇〇 extends Model
この部分で、対応する値が テーブルから取得 される、ということだった。
自分の中ではかなり詰まっていた問題でしたが、スッキリしました。