2016-09-13 36 views
1

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上で動作する可能性がある状態で実行しています。競争状態になる可能性はありますか?

+0

不思議で、そのテーブルの主キーは何ですか? –

+0

デバイスIDはどのように生成されますか? – Shadow

+0

同じデータをダブルポストすると問題が発生することがあります。その場合、 '$ device = UserDevice :: where( 'device_id'、$ device_id) - > first();' – apokryfos

答えて

0

なぜバリデーションを使用しないのですか?

$this->validate($request, [ 
    'device_id' => 'bail|required|unique:user_devices', 
]); 
+1

これは既に存在するデバイスIDを持つリクエストを拒否するためですか?代わりに、私は既存の行を潜在的に新しいデータで更新したいと思います。 –

関連する問題