132 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Illuminate\Database\Eloquent;
 | 
						|
 | 
						|
class SoftDeletingScope implements Scope
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * All of the extensions to be added to the builder.
 | 
						|
     *
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected $extensions = ['Restore', 'WithTrashed', 'WithoutTrashed', 'OnlyTrashed'];
 | 
						|
 | 
						|
    /**
 | 
						|
     * Apply the scope to a given Eloquent query builder.
 | 
						|
     *
 | 
						|
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
 | 
						|
     * @param  \Illuminate\Database\Eloquent\Model  $model
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function apply(Builder $builder, Model $model)
 | 
						|
    {
 | 
						|
        $builder->whereNull($model->getQualifiedDeletedAtColumn());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Extend the query builder with the needed functions.
 | 
						|
     *
 | 
						|
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function extend(Builder $builder)
 | 
						|
    {
 | 
						|
        foreach ($this->extensions as $extension) {
 | 
						|
            $this->{"add{$extension}"}($builder);
 | 
						|
        }
 | 
						|
 | 
						|
        $builder->onDelete(function (Builder $builder) {
 | 
						|
            $column = $this->getDeletedAtColumn($builder);
 | 
						|
 | 
						|
            return $builder->update([
 | 
						|
                $column => $builder->getModel()->freshTimestampString(),
 | 
						|
            ]);
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the "deleted at" column for the builder.
 | 
						|
     *
 | 
						|
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    protected function getDeletedAtColumn(Builder $builder)
 | 
						|
    {
 | 
						|
        if (count((array) $builder->getQuery()->joins) > 0) {
 | 
						|
            return $builder->getModel()->getQualifiedDeletedAtColumn();
 | 
						|
        }
 | 
						|
 | 
						|
        return $builder->getModel()->getDeletedAtColumn();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Add the restore extension to the builder.
 | 
						|
     *
 | 
						|
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    protected function addRestore(Builder $builder)
 | 
						|
    {
 | 
						|
        $builder->macro('restore', function (Builder $builder) {
 | 
						|
            $builder->withTrashed();
 | 
						|
 | 
						|
            return $builder->update([$builder->getModel()->getDeletedAtColumn() => null]);
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Add the with-trashed extension to the builder.
 | 
						|
     *
 | 
						|
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    protected function addWithTrashed(Builder $builder)
 | 
						|
    {
 | 
						|
        $builder->macro('withTrashed', function (Builder $builder, $withTrashed = true) {
 | 
						|
            if (! $withTrashed) {
 | 
						|
                return $builder->withoutTrashed();
 | 
						|
            }
 | 
						|
 | 
						|
            return $builder->withoutGlobalScope($this);
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Add the without-trashed extension to the builder.
 | 
						|
     *
 | 
						|
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    protected function addWithoutTrashed(Builder $builder)
 | 
						|
    {
 | 
						|
        $builder->macro('withoutTrashed', function (Builder $builder) {
 | 
						|
            $model = $builder->getModel();
 | 
						|
 | 
						|
            $builder->withoutGlobalScope($this)->whereNull(
 | 
						|
                $model->getQualifiedDeletedAtColumn()
 | 
						|
            );
 | 
						|
 | 
						|
            return $builder;
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Add the only-trashed extension to the builder.
 | 
						|
     *
 | 
						|
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    protected function addOnlyTrashed(Builder $builder)
 | 
						|
    {
 | 
						|
        $builder->macro('onlyTrashed', function (Builder $builder) {
 | 
						|
            $model = $builder->getModel();
 | 
						|
 | 
						|
            $builder->withoutGlobalScope($this)->whereNotNull(
 | 
						|
                $model->getQualifiedDeletedAtColumn()
 | 
						|
            );
 | 
						|
 | 
						|
            return $builder;
 | 
						|
        });
 | 
						|
    }
 | 
						|
}
 |