gpt4 book ai didi

php - Laravel FirstOrCreate 和 Save() 重复条目

转载 作者:搜寻专家 更新时间:2023-10-31 21:33:53 26 4
gpt4 key购买 nike

我有一张这样的 table

Schema::create('user', function(Blueprint $table)
{
$table->increments('id');
$table->datetime('DateTimeCode');
$table->integer('user_id');
$table->integer('Foo');
$table->softDeletes();
$table->timestamps();

$table->unique(array('user_id', 'DateTimeCode'));
});

当我尝试

User::firstOrCreate($SomeData);

或者

$new_user = new User($SomeData);
$new_user->save();

我明白了

Integrity constraint violation: 1062 Duplicate entry

我不明白,因为我认为我的唯一值定义明确,save()firstOrCreate() 应该只插入一条新记录,如果确实如此不存在。

最佳答案

我也遇到了同样的问题...我用一个 trait 解决了这个问题,方法有点不同,然后从这里开始: https://gist.github.com/troatie/def0fba42fcfb70f873b7f033fbe255f

我简要解释了为什么采用这种方法。我不喜欢对很少发生的事件进行常规数据库锁定,由于 firstOrCreate 有问题,我们每两天在繁忙的服务器上有一次异常。为这种罕见的事件锁定和删除每个创建的锁定......好吧......这种方法在它发生时会小心,因为我是偏执狂,所以我会加倍小心,仅此而已。

<?php

namespace App\Traits;

use Exception;

/**
* Trait OrCreateTrait
*/
trait OrCreateTrait
{
/**
* @param array $attributes
* @param array $values
*
* @return mixed
*/
public static function updateOrCreate(array $attributes, array $values = [])
{
return static::tryManyTimes(function () use ($attributes, $values) {
return (new static)->newQuery()->updateOrCreate($attributes, $values);
});
}

/**
* @param array $attributes
* @param array $values
*
* @return mixed
*/
public static function firstOrCreate(array $attributes, array $values = [])
{
return static::tryManyTimes(function () use ($attributes, $values) {
return (new static)->newQuery()->firstOrCreate($attributes, $values);
});
}

/**
* @param callable $callback
*
* @return mixed
*/
private static function tryManyTimes(callable $callback)
{
try {
$output = $callback();
} catch (Exception $e) {
try {
$output = $callback();
} catch (Exception $e) {
usleep(10000);
try {
$output = $callback();
} catch (Exception $e) {
usleep(100000);
try {
$output = $callback();
} catch (Exception $e) {
usleep(250000);
try {
$output = $callback();
} catch (Exception $e) {
$output = null;
}
}
}
}
}
return $output;
}
}

关于php - Laravel FirstOrCreate 和 Save() 重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24541298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com