Laravel Custom Soft Delete восстановление не работает должным образом - PullRequest
1 голос
/ 25 апреля 2019

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

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.

1 Ответ

0 голосов
/ 08 июня 2019

Это довольно «хитрая» ошибка.

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

  protected function restore() { /**/ }

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

  public function restore() { /**/ }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...