Laravel:2つのカラムが一致するリレーションをしたい

Laravel:2つのカラムが一致するリレーションをしたい

Laravel:2つのカラムが一致するリレーションをしたい

この件はまだまだ勉強中の身であります。

今回作成しているシステムでは、モール毎にジャンルコートがあります。
このモール側が提供しているコードはAPIで簡単に取得更新する事が出来ます。
商品には『ジャンルコード+モールコード』を登録しているので、モール側でジャンルコードの修正があった場合、これを検知しなくてはなりません。

2つのカラム(モールIDとジャンルコード)でリレーション出来れば【不一致】を取得する事で修正に促す事が出来ます。

調べた事を忘れず、今後の組み込み方を検討するために私的備忘録として履歴を残します。

2値のリレーション、調査するためのキーワード

  • 複合主キー
  • サロゲートキー

このキーワードで調べると目的に近い情報がHITします。

ただ、複合キーやサロゲートキーについては様々な意見がある様です。
きっと『確実性』と『運用』の狭間にある問題なのでしょう。

複合主キーの問題点

Laravelでは、基本的に複合主キーは利用できないようです。

理由はバグ発生の可能性を排除できないため。
近い事をやりたいならサロゲートキーを使ってねと言う方向性なのだそうです。

特にどの情報とも連携しない【条件落ち/条件違い】と業務変更等に対する【メンテナンス性の悪さ】が複合主キーを悪とする基盤にある様です。

  • 基本的には複数カラムでのリレーションはお勧めしない。
  • 複合主キーを使う様な設計は見直した方が良い。

サロゲートキー(代理キー)を使う

サロゲートキーを使うと複合主キーを1つのキーであるように扱えるようです。

『カラムA、B』の2値でリレーションしたい場合『サロゲートキー,A,B』とプログラム側でカラムを作ってリレーションするというイメージ。

「だったら最初からAutoIncrementで連番振っちゃえばいいじゃん」と思います。まぁその通りですよね。

実際の運用では、サロゲートキーをナンバリングではなく【A+B】という値にしてリレーションさせる場合もある様です。確かにこれなら2つのカラムでのリレーションが出来たのと同じ解が得られます。

なんで複合主キーにこだわるか

理由は簡単です。

  • システム側が振ったAI値はシステムを使う側には見えないから。
  • システムを使う側は自分たちの扱うオリジナルキーで情報を調査更新するから。

私の例でもそうです。

オリジナルキーは【モール】【(モール毎の)ジャンルコード】です。これにシステム側で新しい番号を付けたとすると管理する番号が3つに増え、システムはスッキリするかもしれませんが運用上は煩雑になります。

『快適だけと使えない(使いにくい)』

これではシステムの意味がありません。

データを取得するだけならControllerで処理して渡せばいい

今回のケースでは、Controllerでの処理で解決できそうです。
Modelで設計したリレーションをView側で回せればビューの記載は簡単なのですが、複合主キーやサロゲートキーを考えないといけません。

「だったらController側で最初から目的の値を抽出して渡せばいいじゃん」

この考えに基づくと以下の2つで表示系は実装が出来ます。

  1. EloquantのwhereHas
  2. クエリビルダーのjoin

更新は個別に行う仕様にすればまぁ問題はないでしょう。