Laravelで複合主キーがある時の更新処理のやり方

Laravelで複合主キーがある時の更新処理のやり方

8 回閲覧されました

みなさんこんにちは、jonioです。

今回はLaravelで複合主キーがある時の更新処理のやり方のメモになります。

Laravelの無料学習サイトを作りました

Laravelを勉強したい人向けの無料の学習サイトを作りました。

ここからリンクに飛べますのでぜひ利用してください。

Laravelのバージョン

今回は11系で動作の確認をしています。

ネットの記事で情報を探した時は5系で解説していたのでバージョン関係なく動作するのかもしれません。

モデルの記述

複合主キーを使う時はモデルに下記の記述をしているはずです。

protected $primaryKey = ['columnA', 'columnB']

動作する時と動作しない時

下記のコードは動作しません。

$tableData = Model::where('columnA', $dataA)
                  ->where('columnB', $dataB)
                  ->first();

if ($tableData) {
    $tableData->fill($data)->save();  
}

動作しない理由は「->save()」を使っているからです。

「->save()」は主キーが1つの時に動作する仕様になっていて複合主キーは複数の主キーのかたまりで考えるので対応できないからです。

他のメソッドだと例えば「updateOrCreate()」も複合主キーに対応していません。

動作するコードは例えば下記です。

$data = [
    'columnC' => $dataC,
    'columnD' => $dataD,
];

$query = Model::where([
    ['columnA', $dataA],
    ['columnB', $dataB],
]);

if ($query->exists()) {
    $query->update($data);
}

クエリビルダを使うと主キーに依存せず6行目〜9行目のようにカラムに該当する値でレコードを探すことができるので更新が可能になります。

恐らくこの書き方が一番シンプルなのではないでしょうか?