中間テーブルに追加の情報(並び順や登録日時など)を持たせたい場合、どうしますか。
belongsToMany に withPivot() で列を指定すれば pivot 経由で読めます。ただし持たせる情報が増えて中間テーブル自体に意味が出てきたら、独立したモデルにする合図です。
面接官が見ているのは中間テーブルの実体を理解しているかの補強。
これは「記事とタグのような多対多を設計するとき、正しいのはどれですか。」への追撃質問です。
よくある答えと、面談でどう見られるか
- belongsToMany に withPivot() で列を指定する。情報が増えたら独立モデルにする
その通りです。「単なる紐付け」から「実体」に変わった時が切り替えどきです。 - 中間テーブルには追加の列を持たせられない
持たせられます。普通のテーブルです。 - 記事テーブル側に持たせる
記事とタグの組み合わせに紐づく情報なので、中間テーブルが正しい置き場所です。 - JSON カラムにまとめて入れる
できなくはないですが、検索や集計がしづらくなります。まず列として持たせます。
面接官は何を見ているか
- withPivot に触れた
- 中間テーブルも普通のテーブルだと理解している
- 情報が増えるならモデル化するという判断に触れた
模範解答
belongsToMany に withPivot() で列を指定すれば、pivot 経由で読めます。中間テーブルも普通のテーブルなので、列を足すこと自体は自由です。ただし、持たせる情報が増えて中間テーブル自体に意味が出てきたら、独立したモデルにして hasMany 2本で繋ぎ直す方が扱いやすくなります。「単なる紐付け」から「実体」に変わった時が切り替えどきです。