Поле 'elpased_time' имеет целочисленное значение, но для его вычисления требуется много времени.Поэтому я хочу рассчитывать только тогда, когда он нулевой.Я положил код в модель доступа.когда я помещаю update () в аксессор, аксессор выполняется дважды.
PHP 7.1
Laravel 5.7
class Process extends Model
{
use SoftDeletes;
...
protected $guarded = [];
...
public function getElapsedTimeAttribute(): ?int
{
// if the value is in DB, return it)
if ($this->attributes['elapsed_time'] !== null) {
return $this->attributes['elapsed_time'];
}
logger('In Process::getDelayTimeAttribute()');
$elapsedTime = VERYLONGTAKENFUNCTION();
$this->attributes['elapsed_time'] = $elapsedTime;
$this->update(['elapsed_time' => $elapsedTime]);
logger('value saved...');
return $elapsedTime;
}
...
}
$ php artisan tinker
>>> App\Process::find(1)->elapsed_time
=> 1116
--- laravel.log
local.DEBUG: In Process::getDelayTimeAttribute()
local.DEBUG: In Process::getDelayTimeAttribute()
local.DEBUG: value saved...
local.DEBUG: value saved...
Я думаю '$ process-> elapsed_time 'может вызывать себя дважды рекурсивно.
, потому что VERYLONGTAKENFUNCTION () требует длительного времени выполнения, это заняло удвоение.Я надеюсь, что он будет запущен только один раз.
- При использовании save () вместо update () произошла ошибка: SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись '7034' для ключа 'PRIMARY'(SQL: вставить в
processes
(id
, ...) значения (7034, ...) - Используя функцию (getElapsedTime ()) вместо аксессора, он работает нормально.