Subversion-Projekte lars-tiefland.laravel_shop

Revision

Revision 148 | Details | Vergleich mit vorheriger | 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
     */
399 lars 12
    protected $extensions = ['Restore', 'RestoreOrCreate', 'WithTrashed', 'WithoutTrashed', 'OnlyTrashed'];
148 lars 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
    /**
399 lars 78
     * Add the restore-or-create extension to the builder.
79
     *
80
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
81
     * @return void
82
     */
83
    protected function addRestoreOrCreate(Builder $builder)
84
    {
85
        $builder->macro('restoreOrCreate', function (Builder $builder, array $attributes = [], array $values = []) {
86
            $builder->withTrashed();
87
 
88
            return tap($builder->firstOrCreate($attributes, $values), function ($instance) {
89
                $instance->restore();
90
            });
91
        });
92
    }
93
 
94
    /**
148 lars 95
     * Add the with-trashed extension to the builder.
96
     *
97
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
98
     * @return void
99
     */
100
    protected function addWithTrashed(Builder $builder)
101
    {
102
        $builder->macro('withTrashed', function (Builder $builder, $withTrashed = true) {
103
            if (! $withTrashed) {
104
                return $builder->withoutTrashed();
105
            }
106
 
107
            return $builder->withoutGlobalScope($this);
108
        });
109
    }
110
 
111
    /**
112
     * Add the without-trashed extension to the builder.
113
     *
114
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
115
     * @return void
116
     */
117
    protected function addWithoutTrashed(Builder $builder)
118
    {
119
        $builder->macro('withoutTrashed', function (Builder $builder) {
120
            $model = $builder->getModel();
121
 
122
            $builder->withoutGlobalScope($this)->whereNull(
123
                $model->getQualifiedDeletedAtColumn()
124
            );
125
 
126
            return $builder;
127
        });
128
    }
129
 
130
    /**
131
     * Add the only-trashed extension to the builder.
132
     *
133
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
134
     * @return void
135
     */
136
    protected function addOnlyTrashed(Builder $builder)
137
    {
138
        $builder->macro('onlyTrashed', function (Builder $builder) {
139
            $model = $builder->getModel();
140
 
141
            $builder->withoutGlobalScope($this)->whereNotNull(
142
                $model->getQualifiedDeletedAtColumn()
143
            );
144
 
145
            return $builder;
146
        });
147
    }
148
}