device_id
のユーザデバイス用のmySQLテーブルがあり、UNIQUE
という制約が割り当てられています。Laravelとの重複エントリ制約違反を避ける
私のLaravelアプリケーションでは、私のAPIController
クラスは、新しいデバイスをテーブルに追加するためのAPIを提供しています。このメソッドは次のようになります:
public function postDevice(Request $request)
{
$user = Auth::user();
if(!$request->has('device_id'))
return response()->json(['error' => 'You need to provide a unique device identifier "device_id".'], 460);
$device_id = $request->input('device_id');
$device = UserDevice::where('device_id', $device_id)->first();
if($device) {
// update device properties with transmitted data
$device->fill($request->all());
// make sure this device belongs to our user
$device->user()->associate($user);
$device->save();
} else {
// create new device for our user
$user->devices()->create($request->all());
}
return response()->json(['status'=>'success']);
}
私の条件では、このAPIを使用して一意性制約を破ることができないと確信していました。しかし、どういうわけか、私は定期的にこのようなエラーが出る:
Integrity constraint violation: 1062 Duplicate entry 'C02P69YWG3QC' for key 'user_devices_device_id_unique' (SQL: insert into 'user_devices' ('device_id', 'mac_model', 'mail_version', 'mailbutler_version', 'osx_version', 'user_id', 'updated_at', 'created_at') values (C02P69YWG3QC, MacBook Pro (Retina, 15-inch, Late 2013), 10.0 (3225), 6439, 10.12.0, 13400, 2016-09-13 12:17:56, 2016-09-13 12:17:56))
あなたは制約は上記のコードを違反することができますどのように任意のアイデアを持っていますか? このようなエラーを回避するためのより良いコーディングパラダイムはありますか?
BTW:このアプリケーションは、複数のインスタンスが同じDB上で動作する可能性がある状態で実行しています。競争状態になる可能性はありますか?
不思議で、そのテーブルの主キーは何ですか? –
デバイスIDはどのように生成されますか? – Shadow
同じデータをダブルポストすると問題が発生することがあります。その場合、 '$ device = UserDevice :: where( 'device_id'、$ device_id) - > first();' – apokryfos