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行目のようにカラムに該当する値でレコードを探すことができるので更新が可能になります。
恐らくこの書き方が一番シンプルなのではないでしょうか?