Пользовательское мягкое удаление Laravel не работает должным образом

Добавление новых столбцов deleted_flag крошечного целого числа в функцию мягкого удаления Lave.

trait  CustomSoftDeleteTrait
{
    use SoftDeletes;

    protected function runSoftDelete()
    {
        $query = $this->setKeysForSaveQuery($this->newModelQuery());

        $time = $this->freshTimestamp();

        $columns = [$this->getDeletedAtColumn() => $this->fromDateTime($time)];

        $this->{$this->getDeletedAtColumn()} = $time;

        if ($this->timestamps && ! is_null($this->getUpdatedAtColumn())) {
            $this->{$this->getUpdatedAtColumn()} = $time;

            $columns[$this->getUpdatedAtColumn()] = $this->fromDateTime($time);
        }

        $columns[$this->getDeletedFlagColumn()] = 1; //<-- here is the deleting

        $query->update($columns);
    }

    protected function restore()
    {            
        if ($this->fireModelEvent('restoring') === false) {
            return false;
        }

        $this->{$this->getDeletedFlagColumn()} = 0; //<-- here is restoring
        $this->{$this->getDeletedAtColumn()} = null;    

        $this->exists = true;

        $result = $this->save();

        $this->fireModelEvent('restored', false);

        return $result;
    }

    public function getDeletedFlagColumn()
    {
        return defined('static::DELETED_FLAG') ? static::DELETED_FLAG : 'deleted_flag';
    }
}

Миграция для модели,

Schema::create('families', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->integer('family_type');

            $table->timestamp('create_date')->nullable();
            $table->timestamp('update_date')->nullable();
            $table->timestamp('delete_date')->nullable();
            $table->tinyInteger('delete_flg')->nullable();
        });

Используя пользовательский признак в модели,

class Family extends Model
{
    use CustomSoftDeleteTrait;

    protected $guarded = [
        'id',
    ];

    const CREATED_AT = 'create_date';
    const UPDATED_AT = 'update_date';
    const DELETED_AT = 'delete_date';
    const DELETED_FLAG = 'delete_flg';
}

Когда модель удаляется с помощью $family->delete(), устанавливаются оба столбца delete_date и delete_flg. При восстановлении модели только одно поле delete_date устанавливается равным нулю. Поле delete_flg остается неизменным на 1.


person M. Ko    schedule 25.04.2019    source источник


Ответы (1)


Это довольно «сложная» ошибка для обнаружения.

Но все, что вам нужно сделать, это изменить модификатор вашей функции restore() с защищенного на общедоступный в вашем пользовательском свойстве.

  protected function restore() { /**/ }

должен превратиться в

  public function restore() { /**/ }

Защищенная функция недоступна из вашей семейной модели. Таким образом, PHP просто использует исходный метод restore() из свойства Eloquent Soft Delete.

person shock_gone_wild    schedule 08.06.2019