1 | <?php namespace App\Models; |
||
25 | class NestedEntity extends \Eloquent |
||
26 | { |
||
27 | use SoftDeletes; |
||
28 | |||
29 | protected $table = "nested_entities"; |
||
30 | |||
31 | protected $guarded = ["left_range", "right_range"]; |
||
32 | |||
33 | const SELECT_ALL_WITH_MINIMUM_INFO = 1; |
||
34 | |||
35 | const SELECT_SINGLE_PATH_ONLY = 2; |
||
36 | |||
37 | const SELECT_WITH_DEPTH_INFO = 4; |
||
38 | |||
39 | const SELECT_LEAVES_ONLY = 8; |
||
40 | |||
41 | /** |
||
42 | * @param $newEntityName |
||
43 | * @param int $referenceEntityId |
||
44 | * |
||
45 | * @return boolean |
||
46 | * @throws \InvalidArgumentException |
||
47 | */ |
||
48 | 2 | public function insertIntoAtTheBeginning($newEntityName, $referenceEntityId) |
|
49 | { |
||
50 | # Fetch reference entity |
||
51 | 2 | $referenceEntity = \DB::table($this->table)->where('id', $referenceEntityId)->first(); |
|
52 | 2 | if (is_null($referenceEntity)) { |
|
53 | 1 | throw new \InvalidArgumentException("Reference entity with id: " . $referenceEntityId . " not found!"); |
|
54 | } |
||
55 | |||
56 | 1 | \DB::transaction( |
|
57 | function () use ($newEntityName, $referenceEntity) { |
||
58 | # Create new entity |
||
59 | 1 | $newEntity = \DB::table($this->table); |
|
60 | |||
61 | # Update ranges in preparation of insertion |
||
62 | 1 | \DB::table($this->table) |
|
63 | 1 | ->where('right_range', '>', $referenceEntity->left_range) |
|
64 | 1 | ->update(['right_range' => \DB::raw('right_range + 2')]); |
|
65 | 1 | \DB::table($this->table) |
|
66 | 1 | ->where('left_range', '>', $referenceEntity->left_range) |
|
67 | 1 | ->update(['left_range' => \DB::raw('left_range + 2')]); |
|
68 | |||
69 | # Insert now |
||
70 | 1 | return $newEntity->insert([ |
|
71 | 1 | 'name' => $newEntityName, |
|
72 | 1 | 'left_range' => $referenceEntity->left_range + 1, |
|
73 | 1 | 'right_range' => $referenceEntity->left_range + 2, |
|
74 | 1 | 'created_at' => Carbon::now(), |
|
75 | 1 | 'updated_at' => Carbon::now() |
|
76 | ]); |
||
77 | 1 | } |
|
78 | ); |
||
79 | 1 | } |
|
80 | |||
81 | |||
82 | /** |
||
83 | * @param $newEntityName |
||
84 | * @param int $referenceEntityId |
||
85 | * |
||
86 | * @return boolean |
||
87 | * @throws \InvalidArgumentException |
||
88 | */ |
||
89 | 1 | public function insertIntoAtTheEnd($newEntityName, $referenceEntityId) |
|
90 | { |
||
91 | # Fetch reference entity |
||
92 | 1 | $referenceEntity = \DB::table($this->table)->where('id', $referenceEntityId)->first(); |
|
93 | 1 | if (is_null($referenceEntity)) { |
|
94 | throw new \InvalidArgumentException("Reference entity with id: " . $referenceEntityId . " not found!"); |
||
95 | } |
||
96 | |||
97 | 1 | \DB::transaction( |
|
98 | function () use ($newEntityName, $referenceEntity) { |
||
99 | # Create new entity |
||
100 | 1 | $newEntity = \DB::table($this->table); |
|
101 | |||
102 | # Update ranges in preparation of insertion |
||
103 | 1 | \DB::table($this->table) |
|
104 | 1 | ->where('right_range', '>=', $referenceEntity->right_range) |
|
105 | 1 | ->update(['right_range' => \DB::raw('right_range + 2')]); |
|
106 | 1 | \DB::table($this->table) |
|
107 | 1 | ->where('left_range', '>', $referenceEntity->right_range) |
|
108 | 1 | ->update(['left_range' => \DB::raw('left_range + 2')]); |
|
109 | |||
110 | # Insert now |
||
111 | 1 | return $newEntity->insert([ |
|
112 | 1 | 'name' => $newEntityName, |
|
113 | 1 | 'left_range' => $referenceEntity->right_range, |
|
114 | 1 | 'right_range' => $referenceEntity->right_range + 1, |
|
115 | 1 | 'created_at' => Carbon::now(), |
|
116 | 1 | 'updated_at' => Carbon::now() |
|
117 | ]); |
||
118 | 1 | } |
|
119 | ); |
||
120 | 1 | } |
|
121 | |||
122 | |||
123 | /** |
||
124 | * Alias to insertIntoAtTheEnd() |
||
125 | * |
||
126 | * @param $newEntityName |
||
127 | * @param int $referenceEntityId |
||
128 | * |
||
129 | * @return boolean |
||
130 | * @throws \InvalidArgumentException |
||
131 | */ |
||
132 | 1 | public function insertInto($newEntityName, $referenceEntityId) |
|
136 | |||
137 | |||
138 | /** |
||
139 | * @param string $newEntityName |
||
140 | * @param int $referenceEntityId |
||
141 | * |
||
142 | * @return boolean |
||
143 | * @throws \InvalidArgumentException |
||
144 | */ |
||
145 | 1 | public function prependTo($newEntityName, $referenceEntityId) |
|
177 | |||
178 | |||
179 | /** |
||
180 | * @param string $newEntityName |
||
181 | * @param int $referenceEntityId |
||
182 | * |
||
183 | * @return boolean |
||
184 | * @throws \InvalidArgumentException |
||
185 | */ |
||
186 | 1 | public function appendTo($newEntityName, $referenceEntityId) |
|
218 | |||
219 | |||
220 | 2 | public function remove($id, $doSoftDelete = true) |
|
255 | |||
256 | |||
257 | /** |
||
258 | * @param int $flag Parameters of Select, which are defined bitwise (see self:SELECT__* constants) |
||
259 | * @param string $id Path information: used only if anything path related is requested. |
||
260 | * |
||
261 | * @return array|static[] |
||
262 | * @throws \InvalidArgumentException |
||
263 | */ |
||
264 | 2 | public function fetch($flag = self::SELECT_ALL_WITH_MINIMUM_INFO, $id = null) |
|
304 | } |
||
305 |