Modelクラスで値を取るのは3種類ある?
$user->category
こんな感じに値を取る時に、Modelクラスは何をしているでしょう。
この時の値の取得方法は、3種類くらいあります。
そして、それぞれ優先度があります。
優先度の高いものがあれば、それを返して、なければ低いものを返します。
優先度の高い順から見てみましょう。
1. 値がそのまま入っているパターン
$user->category = 1;
こんなふうに代入したり、テーブルのカラムでcategoryという名前があり、そのフィールド値を取ってきたパターン。
これがあれば、優先的に取ってきます。
Modelクラスの中の $attributes
のフィールドがこれになります。
2. リレーションでイーガーロードしていた場合
User::with('categories')->get();
このように、Userテーブルに関連するcategoriesテーブルの値もまとめて取得した場合。
この場合は、その値を取得します。
Modelクラスの中の $relations
のフィールドがこれになります。
setRelation
関数でセットするのもここに当たります。
3. メソッドで取得した場合
public function category() { return $this->belongsTo(User::class); }
該当Modelクラスに記述した、関数を元にリレーションを取得する場合。
呼び出した時にクエリが走って、ループ内で書いたらN+1問題がーってお話があるやつですね。
よく見るやつです。
最後に
$user->category
こう書いたとしても、裏でいろいろやっています。
それは、対象のModelクラスの状態によって3つに分かれてます。
ダミーデータ作る時とか、ここを意識すると良いかもしれないですー
みんな嫌いだけど便利な__get関数が頑張ってるよ