Completed
Push — deleted_model_event_bug ( 643b4d...4d03c1 )
by Richan
01:21
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
     * @return \Illuminate\Database\Eloquent\Builder
70
     */
71
    protected function getQuery(Model $model) :Builder
72
    {
73
        $query = $model->newQuery();
74
75
        $traits = class_uses($model);
76
77
        if (in_array(SoftDeletes::class, $traits, true)) {
78
            $query->withTrashed();
79
        }
80
81
        return $query;
82
    }
83
84
    /**
85
     * Model accessor.
86
     *
87
     * @return \Illuminate\Database\Eloquent\Model
88
     */
89
    public function model() :Model
90
    {
91
        return $this->retrieveModel() ?? $this->createDirtyModel();
92
    }
93
94
    /**
95
     * Retrieve fresh eloquent model from
96
     * run-time cache or the database.
97
     *
98
     * @return \Illuminate\Database\Eloquent\Model|null
99
     */
100
    protected function retrieveModel() :?Model
101
    {
102
        if ($this->model !== null) {
103
            return $this->model;
104
        }
105
106
        $model = app($this->modelClass);
107
108
        $this->model = $this->getQuery($model)->find(data_get($this->data, $model->getKeyName()));
109
110
        return $this->model;
111
    }
112
}
113