Subversion-Projekte lars-tiefland.laravel_shop

Revision

Zur aktuellen Revision | Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php
2
 
3
namespace Illuminate\Database\Eloquent;
4
 
5
class SoftDeletingScope implements Scope
6
{
7
    /**
8
     * All of the extensions to be added to the builder.
9
     *
10
     * @var string[]
11
     */
12
    protected $extensions = ['Restore', 'WithTrashed', 'WithoutTrashed', 'OnlyTrashed'];
13
 
14
    /**
15
     * Apply the scope to a given Eloquent query builder.
16
     *
17
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
18
     * @param  \Illuminate\Database\Eloquent\Model  $model
19
     * @return void
20
     */
21
    public function apply(Builder $builder, Model $model)
22
    {
23
        $builder->whereNull($model->getQualifiedDeletedAtColumn());
24
    }
25
 
26
    /**
27
     * Extend the query builder with the needed functions.
28
     *
29
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
30
     * @return void
31
     */
32
    public function extend(Builder $builder)
33
    {
34
        foreach ($this->extensions as $extension) {
35
            $this->{"add{$extension}"}($builder);
36
        }
37
 
38
        $builder->onDelete(function (Builder $builder) {
39
            $column = $this->getDeletedAtColumn($builder);
40
 
41
            return $builder->update([
42
                $column => $builder->getModel()->freshTimestampString(),
43
            ]);
44
        });
45
    }
46
 
47
    /**
48
     * Get the "deleted at" column for the builder.
49
     *
50
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
51
     * @return string
52
     */
53
    protected function getDeletedAtColumn(Builder $builder)
54
    {
55
        if (count((array) $builder->getQuery()->joins) > 0) {
56
            return $builder->getModel()->getQualifiedDeletedAtColumn();
57
        }
58
 
59
        return $builder->getModel()->getDeletedAtColumn();
60
    }
61
 
62
    /**
63
     * Add the restore extension to the builder.
64
     *
65
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
66
     * @return void
67
     */
68
    protected function addRestore(Builder $builder)
69
    {
70
        $builder->macro('restore', function (Builder $builder) {
71
            $builder->withTrashed();
72
 
73
            return $builder->update([$builder->getModel()->getDeletedAtColumn() => null]);
74
        });
75
    }
76
 
77
    /**
78
     * Add the with-trashed extension to the builder.
79
     *
80
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
81
     * @return void
82
     */
83
    protected function addWithTrashed(Builder $builder)
84
    {
85
        $builder->macro('withTrashed', function (Builder $builder, $withTrashed = true) {
86
            if (! $withTrashed) {
87
                return $builder->withoutTrashed();
88
            }
89
 
90
            return $builder->withoutGlobalScope($this);
91
        });
92
    }
93
 
94
    /**
95
     * Add the without-trashed extension to the builder.
96
     *
97
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
98
     * @return void
99
     */
100
    protected function addWithoutTrashed(Builder $builder)
101
    {
102
        $builder->macro('withoutTrashed', function (Builder $builder) {
103
            $model = $builder->getModel();
104
 
105
            $builder->withoutGlobalScope($this)->whereNull(
106
                $model->getQualifiedDeletedAtColumn()
107
            );
108
 
109
            return $builder;
110
        });
111
    }
112
 
113
    /**
114
     * Add the only-trashed extension to the builder.
115
     *
116
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
117
     * @return void
118
     */
119
    protected function addOnlyTrashed(Builder $builder)
120
    {
121
        $builder->macro('onlyTrashed', function (Builder $builder) {
122
            $model = $builder->getModel();
123
 
124
            $builder->withoutGlobalScope($this)->whereNotNull(
125
                $model->getQualifiedDeletedAtColumn()
126
            );
127
 
128
            return $builder;
129
        });
130
    }
131
}