Laravelで複合プライマリキーのテーブルを更新する
現在LaravelでAndroidアプリを作成中ですが、クエリビルダーの更新処理で少し詰まってしまったので備忘録です。
Laravelに複合プライマリキーは向いていない?
今までテーブル定義でサロゲートキー(代理キー)を使用することが多かったのですが、構想中のアプリの構造上複合PKの方が管理しやすいと思ったので定義。
しかしAjaxでDBの既存情報を更新する際、ChromeのデベロッパーツールのConsoleに下記のようなエラーが、、、
Illegal offset type at ~
調べてみるとLaravelのORMでは複合PKは推奨されていないよう。
参照:https://atuweb.net/201610_laravel-eloquent-orm-id-agreement/
しかし敢えて複合プライマリキーで実装してみる
しかし今からテーブル定義を変更するのも面倒手間なので、複合PKのまま実装を続行する。
調べたらHasCompositePrimaryKey トレイトを使用すれば大丈夫なようだ。
参照:https://qiita.com/hidea/items/968c1013a7663de8d9cc
HasCompositePrimaryKey トレイトの使用
インストール
まずはComposerでインストール。
# composer require mopo922/laravel-treats
少し話は逸れるが、久々にComposerコマンド使おうとしたら「コマンドが見つかりません」というエラーが表示されてビビった。
# ll /usr/local/bin/composer
上記にcomposerファイルが存在しているのは確認したので、エイリアスを設定して解決。
# alias composer="php /usr/local/bin/composer"
参照:https://qiita.com/masa_stone22/items/bb56170f540391ba554d
インポート
インストールが完了したら、Modelファイルでインポート。
Class内でインポートしなきゃだめらしい。(それしか試してないけど)
class HogeHoge extends Model
{
use \LaravelTreats\Model\Traits\HasCompositePrimaryKey;
protected $primaryKey = [
'hoge_id',
'hoge_hoge'
];
…
}
これでsaveメソッドで更新処理が可能になりました。
所感
次期Laravelアップデートではもう少し複合PKに優しくなってほしいです。