【问题标题】:Avoid duplicate entry constraint violation with Laravel使用 Laravel 避免重复输入约束违规
【发布时间】:2016-09-13 13:26:19
【问题描述】:

我有一个用于用户设备的 mySQL 表,其中有一列 device_id,其中分配了一个 UNIQUE 约束。

在我的 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))

您知道上面显示的代码如何违反约束吗? 是否有更好的编码范例来避免此类错误?

顺便说一句:我正在运行这个应用程序,可能有多个实例在同一个数据库上工作。会不会涉及到竞态条件?

【问题讨论】:

  • 出于好奇,那张表的主键是什么?
  • 设备id是如何生成的?
  • 重复发布相同数据可能会出现问题。在这种情况下,您可能需要在执行 $device = UserDevice::where('device_id', $device_id)->first(); 之前获得表上的写锁
  • 该表的主键是id INT(11)。
  • 如果相同的数据被发布两次,那么查询不应该返回结果吗?

标签: php mysql laravel unique


【解决方案1】:

为什么不使用验证?

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

【讨论】:

  • 因为这会拒绝具有现有设备 ID 的请求,对吧?相反,我想用潜在的新数据更新现有行。
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 2014-09-28
  • 2020-04-22
  • 1970-01-01
相关资源
最近更新 更多