Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Laravel避免重复条目约束冲突_Php_Mysql_Laravel_Unique - Fatal编程技术网

Php 使用Laravel避免重复条目约束冲突

Php 使用Laravel避免重复条目约束冲突,php,mysql,laravel,unique,Php,Mysql,Laravel,Unique,我有一个用于用户设备的mySQL表,其中有一列device\u id,其中有一个UNIQUE约束 在我的Laravel应用程序中,我的APIController类提供了一个API,用于向表中添加新设备。方法如下所示: public function postDevice(Request $request) { $user = Auth::user(); if(!$request->has('device_id')) return response()-&g

我有一个用于用户设备的mySQL表,其中有一列
device\u 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']);
}
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))
我认为我的条件将确保通过此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']);
}
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))
您知道上面显示的代码如何违反约束吗? 是否有更好的编码范例来避免此类错误


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

为什么不使用验证

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

为什么不使用验证

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

出于好奇,该表上的主键是什么?设备id是如何生成的?问题可能源于重复发布相同的数据。在这种情况下,您可能需要在执行
$device=UserDevice::where('device_id',$device_id)->first()之前获取表上的写锁
该表的主键是
id
INT(11)。如果相同的数据发布了两次,那么查询不应该返回结果吗?出于好奇,该表上的主键是什么?设备id是如何生成的?问题可能来自双重发布相同的数据。在这种情况下,您可能需要在执行
$device=UserDevice::where('device_id',$device_id)->first()之前获取表上的写锁
该表的主键是
id
INT(11)。如果相同的数据发布两次,那么查询不应该返回一个结果吗?因为这将拒绝一个已经存在设备id的请求,对吗?相反,我想用可能的新数据更新现有行。因为这将拒绝具有现有设备ID的请求,对吗?相反,我想用可能的新数据更新现有行。