Laravelで複合プライマリキーのテーブルを更新する

Laravel,PHPMySQL,PHP 7

 

現在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に優しくなってほしいです。

Laravel,PHPMySQL,PHP 7