0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelの$〇〇->△△->✗✗();//何言ってるんですか?

Posted at

実践的なアプリの開発の一部の機能をお手伝いしていた時

いつも通り、
「このパターンはここのコントローラーの中身を流用して、こう作る〜これで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

この部分で、対応する値が テーブルから取得 される、ということだった。


自分の中ではかなり詰まっていた問題でしたが、スッキリしました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?