Есть такая таблица:
Schema::create('open_orders', function (Blueprint $table) {
$table->uuid('orderID');
$table->primary('orderID');
...
$table->string('transactTime');
$table->timestamps();
});
Периодически нужно синхронить в нее данные использую updateOrCreate:
$active_orders = $this->api->getOpenOrders();
foreach ($active_orders as $order)
{
Orders::updateOrCreate([
'orderID' => $order['orderID'],
...
'transactTime' => $order['transactTime']
]);
}
Итого, первый раз запись создается, а со второго:
Integrity constraint violation: 1062 Duplicate entry '0b357043-4699-83d8-7118-c5a369b3ef75' for key 'PRIMARY'...
Подскажите, что я делаю не так, ведь после первой вставки, если запись существует то ее должно просто обновлять...
В документации же написано всё:
If the model can not be found in the database, a record will be inserted with the attributes from the first parameter, along with those in the optional second parameter.
Так же это написано в API:
Create or update a record matching the attributes, and fill it with values.
В вашем случае нужно orderID только оставлять в первом параметре, остальные выносить во второй параметр:
Orders::updateOrCreate(['orderID' => $order['orderID']],
[
...
'transactTime' => $order['transactTime']
]);
В таком случае будет поиск только по orderID и метод будет работать правильно.
Скорее всего PRIMARY ключ не меняется, но и из-за того что меняется хоть одно поле в массиве у updateOrCreate, функция пытается создать новую запись, а PRIMARY ключ повторяется.
Понять как работает метод изнутри помогут две ссылки:
https://github.com/laravel/framework/blob/5.7/src/Illuminate/Database/Eloquent/Builder.php#L428 https://github.com/laravel/framework/blob/5.7/src/Illuminate/Database/Eloquent/Builder.php#L394
Сборка персонального компьютера от Artline: умный выбор для современных пользователей