Change::scopeOfType()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 2
1
<?php namespace Cviebrock\EloquentLoggable\Models;
2
3
use Cviebrock\EloquentLoggable\Loggable;
4
use Illuminate\Database\Eloquent\Builder;
5
use Illuminate\Database\Eloquent\Model;
6
use Illuminate\Database\Eloquent\Relations\BelongsTo;
7
use Illuminate\Database\Eloquent\Relations\MorphTo;
8
use Illuminate\Support\Facades\Config;
9
10
11
class Change extends Model
12
{
13
14
    const TYPE_CREATE = 'create';
15
    const TYPE_UPDATE = 'update';
16
    const TYPE_DELETE = 'delete';
17
    const TYPE_RESTORE = 'restore';
18
19
    /**
20
     * The table associated with the model.
21
     *
22
     * @var string
23
     */
24
    protected $table = 'loggable_changes';
25
26
    /**
27
     * The attributes that are mass assignable.
28
     *
29
     * @var array
30
     */
31
    protected $fillable = [
32
        'user_id',
33
        'attribute',
34
        'old_value',
35
        'new_value',
36
        'model_id',
37
        'model_type',
38
        'type',
39
        'set',
40
    ];
41
42
    /**
43
     * Relation to user who made the change.
44
     *
45
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
46
     */
47
    public function user(): BelongsTo
48
    {
49
        return $this->belongsTo(Config::get('loggable.user_model'));
50
    }
51
52
    /**
53
     * Polymorphic relation to model.
54
     *
55
     * @return \Illuminate\Database\Eloquent\Relations\MorphTo
56
     */
57
    public function model(): MorphTo
58
    {
59
        return $this->morphTo();
60
    }
61
62
    /**
63
     * Scope to find changes of a given type.
64
     *
65
     * @param \Illuminate\Database\Eloquent\Builder $query
66
     * @param string $type
67
     *
68
     * @return \Illuminate\Database\Eloquent\Builder
69
     */
70
    public function scopeOfType(Builder $query, string $type): Builder
71
    {
72
        return $query->where('type', $type);
73
    }
74
75
    /**
76
     * Scope to find changes in a given set.
77
     *
78
     * @param \Illuminate\Database\Eloquent\Builder $query
79
     * @param string $set
80
     *
81
     * @return \Illuminate\Database\Eloquent\Builder
82
     */
83
    public function scopeInSet(Builder $query, string $set): Builder
84
    {
85
        return $query->where('set', $set);
86
    }
87
88
    /**
89
     * Scope to group changes by set.
90
     *
91
     * @param \Illuminate\Database\Eloquent\Builder $query
92
     *
93
     * @return \Illuminate\Database\Eloquent\Builder
94
     */
95
    public function scopeGroupedBySet(Builder $query): Builder
96
    {
97
        return $query->groupBy('set');
98
    }
99
100
    /**
101
     * Scope to find changes for a given model.
102
     *
103
     * @param \Illuminate\Database\Eloquent\Builder $query
104
     * @param \Cviebrock\EloquentLoggable\Loggable|\Illuminate\Database\Eloquent\Model $model
105
     *
106
     * @return \Illuminate\Database\Eloquent\Builder
107
     */
108
    public function scopeForModel(Builder $query, Loggable $model): Builder
109
    {
110
        return $query->where('model_type', get_class($model))
111
            ->where('model_id', $model->getKey());
0 ignored issues
show
Bug introduced by
It seems like getKey() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
112
    }
113
}
114
115