Функция update () заставляет аксессор дважды выполняться в laravel - PullRequest
0 голосов
/ 05 мая 2019

Поле '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 ()) вместо аксессора, он работает нормально.
...