Completed
Push — master ( aa8576...1c4beb )
by Richan
01:22
created

ModelHasUpdated::retrieveModel()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 12
rs 9.8666
c 0
b 0
f 0
cc 2
nc 2
nop 0
1
<?php
2
3
namespace RichanFongdasen\Varnishable\Events;
4
5
use Illuminate\Database\Eloquent\Builder;
6
use Illuminate\Database\Eloquent\Model;
7
use Illuminate\Database\Eloquent\SoftDeletes;
8
use Illuminate\Queue\SerializesModels;
9
10
class ModelHasUpdated
11
{
12
    use SerializesModels;
13
14
    /**
15
     * Eloquent model's data
16
     * after getting serialized into array.
17
     *
18
     * @var array
19
     */
20
    protected $data;
21
22
    /**
23
     * Eloquent model object.
24
     *
25
     * @var \Illuminate\Database\Eloquent\Model
26
     */
27
    protected $model;
28
29
    /**
30
     * Eloquent model class name.
31
     *
32
     * @var string
33
     */
34
    protected $modelClass;
35
36
    /**
37
     * Event constructor.
38
     *
39
     * @param \Illuminate\Database\Eloquent\Model $model
40
     */
41
    public function __construct(Model $model)
42
    {
43
        $this->data = $model->toArray();
44
        $this->modelClass = get_class($model);
45
    }
46
47
    /**
48
     * Create dirty eloquent model object
49
     * based on the last saved model data.
50
     *
51
     * @return \Illuminate\Database\Eloquent\Model
52
     */
53
    protected function createDirtyModel() :Model
54
    {
55
        $this->model = app($this->modelClass);
56
        $this->model->fill($this->data);
57
58
        $key = $this->model->getKeyName();
59
        $this->model->setAttribute($key, data_get($this->data, $key));
60
61
        return $this->model;
62
    }
63
64
    /**
65
     * Get eloquent query builder for
66
     * the given eloquent model.
67
     *
68
     * @param \Illuminate\Database\Eloquent\Model $model
69
     *
70
     * @return \Illuminate\Database\Eloquent\Builder
71
     */
72
    protected function getQuery(Model $model) :Builder
73
    {
74
        $query = $model->newQuery();
75
76
        $traits = class_uses($model);
77
78
        if (in_array(SoftDeletes::class, $traits, true)) {
79
            $query->withTrashed();
80
        }
81
82
        return $query;
83
    }
84
85
    /**
86
     * Model accessor.
87
     *
88
     * @return \Illuminate\Database\Eloquent\Model
89
     */
90
    public function model() :Model
91
    {
92
        return $this->retrieveModel() ?? $this->createDirtyModel();
93
    }
94
95
    /**
96
     * Retrieve fresh eloquent model from
97
     * run-time cache or the database.
98
     *
99
     * @return \Illuminate\Database\Eloquent\Model|null
100
     */
101
    protected function retrieveModel() :?Model
102
    {
103
        if ($this->model !== null) {
104
            return $this->model;
105
        }
106
107
        $model = app($this->modelClass);
108
109
        $this->model = $this->getQuery($model)->find(data_get($this->data, $model->getKeyName()));
110
111
        return $this->model;
112
    }
113
}
114