Laravelで複合キーに対応する方法

■はじめに

確か、以前やってた時は複合キーって扱えてたと思う

だけど・・・
ErrorException in Model.php line XXX: Illegal offset type in isset or empty
とか
Illegal offset type
が発生して、度々調べて

『複合キーはサポートされていない』
『サロゲートキーを使用しましょう』など

否定的な情報が多くて肝心な情報が埋もれていたので
備忘録として残しておきます。

 

■環境情報

Laravel 5.5
PHP 7.1

 

■Laravelで複合キー対応方法

基本対応

Modelに$fillableと$primaryKeyと$incrementingを設定

 

対応方法その1(検索条件を配列に纏める)

この方法でも数が少なければ良いと思いますが
私は下記トレイトを使ったその2をお勧めします。

 

対応方法その2(トレイトを使ってオーバーライド)

元ネタはstackoverflowです。

下記メソッドをHasCompositePrimaryKeyなどの名前でTraitを作りましょう。

 

作成したHasCompositePrimaryKeyを
複合キーのModelにuseする

 
 

これで、モデル以外は複合キーを意識しないでも操作出来るようになりました。

 

■終わりに

フレームワークのバージョンが変わると同じ方法が使えなくなったりするので
拡張やカスタマイズってあまりやりたくないんですよね

でも、今回の対応はかなり調査工数削減につながるのでお勧めです。

この情報が少しでも役立つと嬉しいです