エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【Laravel】Modelクラスから値を取る時には3種類の要素が関わっている【795日目】

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関数が頑張ってるよ