1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* Class DataBaseModel: |
5
|
|
|
* This is an abstract class which stands as a model |
6
|
|
|
* to another class e.g User class which can inherit from |
7
|
|
|
* all its methods. This class stands as a middle man |
8
|
|
|
* between the User class and the DataBaseQuery class. |
9
|
|
|
* |
10
|
|
|
* @author: Raimi Ademola <[email protected]> |
11
|
|
|
* @copyright: 2016 Andela |
12
|
|
|
*/ |
13
|
|
|
namespace Demo; |
14
|
|
|
|
15
|
|
|
use Doctrine\Common\Inflector\Inflector; |
16
|
|
|
|
17
|
|
|
abstract class DataBaseModel implements DataBaseModelInterface |
18
|
|
|
{ |
19
|
|
|
protected $tableName; |
20
|
|
|
protected $dbConn; |
21
|
|
|
protected $dataBaseQuery; |
22
|
|
|
protected $properties; |
23
|
|
|
protected $arrayField; |
24
|
|
|
|
25
|
|
|
/** |
26
|
|
|
* This is a constructor; a default method that will be called automatically during class instantiation. |
27
|
|
|
*/ |
28
|
42 |
|
public function __construct($dbConn) |
29
|
|
|
{ |
30
|
42 |
|
$this->tableName = self::getClassName(); |
31
|
3 |
|
$this->dataBaseQuery = new DataBaseQuery($dbConn); |
32
|
|
|
$this->arrayField['id'] = 0; |
33
|
42 |
|
} |
34
|
|
|
|
35
|
42 |
|
/** |
36
|
42 |
|
* The magic setter method. |
37
|
42 |
|
* |
38
|
|
|
* @param $properties |
39
|
|
|
* @param $values |
40
|
|
|
* |
41
|
|
|
* @return array associative array properties |
42
|
|
|
*/ |
43
|
|
|
public function __set($properties, $values) |
44
|
|
|
{ |
45
|
|
|
$this->arrayField[$properties] = $values; |
46
|
|
|
} |
47
|
42 |
|
|
48
|
|
|
/** |
49
|
42 |
|
* The magic getter method. |
50
|
42 |
|
* |
51
|
|
|
* @param $properties |
52
|
|
|
* |
53
|
|
|
* @return array key |
54
|
|
|
*/ |
55
|
|
|
public function __get($properties) |
56
|
|
|
{ |
57
|
|
|
return $this->arrayField[$properties]; |
58
|
|
|
} |
59
|
|
|
|
60
|
|
|
/** |
61
|
|
|
* This method gets all the record from a particular table |
62
|
|
|
* by accessing the read method from the DataBaseQuery class. |
63
|
|
|
* |
64
|
|
|
* @throws NoDataFoundException |
65
|
|
|
* |
66
|
|
|
* @return associative array |
67
|
|
|
*/ |
68
|
|
|
public static function getAll($dbConn) |
69
|
|
|
{ |
70
|
|
|
$sqlData = DataBaseQuery::read($id = false, self::getClassName(), $dbConn); |
71
|
|
|
|
72
|
6 |
|
return $sqlData; |
73
|
|
|
} |
74
|
6 |
|
|
75
|
|
|
/** |
76
|
3 |
|
* This method either create or update record in a database table |
77
|
|
|
* by calling either the read method or create method in the |
78
|
|
|
* DataBaseQuery class. |
79
|
|
|
* |
80
|
|
|
* @throws NoRecordUpdateException |
81
|
|
|
* @throws EmptyArrayException |
82
|
|
|
* @throws NoRecordCreatedException |
83
|
|
|
* |
84
|
|
|
* @return bool true or false; |
85
|
|
|
*/ |
86
|
|
|
public function save($dbConn) |
87
|
|
|
{ |
88
|
|
|
if ($this->arrayField['id']) { |
89
|
|
|
$sqlData = DataBaseQuery::read($this->arrayField['id'], self::getClassName(), $dbConn); |
90
|
2 |
|
|
91
|
|
|
if ($this->checkIfRecordIsEmpty($sqlData)) { |
92
|
|
|
$boolCommit = $this->dataBaseQuery->update(['id' => $this->arrayField['id']], $this->arrayField, self::getClassName(), $dbConn); |
93
|
|
|
|
94
|
|
|
if ($boolCommit) { |
95
|
|
|
return true; |
96
|
|
|
} |
97
|
|
|
|
98
|
|
|
$this->throwNoRecordUpdatedException(); |
99
|
2 |
|
|
100
|
|
|
// throw new NoRecordUpdatedException('oops, your record did not update succesfully'); |
|
|
|
|
101
|
|
|
} |
102
|
|
|
|
103
|
|
|
throw new EmptyArrayException("data passed didn't match any record"); |
104
|
|
|
} else { |
105
|
|
|
|
106
|
|
|
$boolCommit = $this->dataBaseQuery->create($this->arrayField, self::getClassName(), $dbConn); |
107
|
|
|
|
108
|
|
|
if ($boolCommit) { |
|
|
|
|
109
|
|
|
return true; |
110
|
|
|
} |
111
|
|
|
|
112
|
|
|
throw new NoRecordCreatedException('oops,your record did not create succesfully'); |
113
|
|
|
} |
114
|
|
|
|
115
|
|
|
} |
116
|
|
|
|
117
|
|
|
public function throwNoRecordUpdatedException() |
118
|
|
|
{ |
119
|
|
|
$message = 'oops, your record did not update succesfully'; |
120
|
|
|
throw new NoRecordUpdatedException($message); |
121
|
|
|
} |
122
|
|
|
|
123
|
|
|
/** |
124
|
|
|
* This method find a record by id. |
125
|
|
|
* |
126
|
|
|
* @param $id |
127
|
|
|
* |
128
|
|
|
* @throws ArgumentNumberIncorrectException |
129
|
9 |
|
* @throws ArgumentNotFoundException |
130
|
|
|
* |
131
|
9 |
|
* @return object |
132
|
|
|
*/ |
133
|
9 |
|
public static function findById($id) |
134
|
3 |
|
{ |
135
|
|
|
$numArgs = func_num_args(); |
136
|
|
|
|
137
|
6 |
|
if ($numArgs > 1) { |
138
|
3 |
|
throw new ArgumentNumberIncorrectException('Please input just one Argument'); |
139
|
|
|
} |
140
|
|
|
|
141
|
3 |
|
if ($id == '') { |
142
|
|
|
throw new ArgumentNotFoundException('No Argument found, please input an argument'); |
143
|
|
|
} |
144
|
|
|
|
145
|
|
|
$staticFindInstance = new static(); |
|
|
|
|
146
|
|
|
|
147
|
|
|
$staticFindInstance->id = $id; |
|
|
|
|
148
|
|
|
|
149
|
|
|
return $staticFindInstance; |
150
|
|
|
} |
151
|
|
|
|
152
|
|
|
/** |
153
|
|
|
* This method find a record by id and returns |
154
|
|
|
* all the data present in the id. |
155
|
|
|
* |
156
|
|
|
* |
157
|
|
|
* @return associative array |
158
|
|
|
*/ |
159
|
|
|
public function getById() |
160
|
|
|
{ |
161
|
|
|
if ($this->arrayField['id']) { |
162
|
|
|
$sqlData = DataBaseQuery::read($this->arrayField['id'], self::getClassName(), $dbConn); |
|
|
|
|
163
|
|
|
|
164
|
|
|
return $sqlData; |
165
|
|
|
} |
166
|
|
|
} |
167
|
|
|
|
168
|
|
|
/** |
169
|
|
|
* This method delete a row from the table by the row id. |
170
|
|
|
* |
171
|
|
|
* @param $id |
172
|
|
|
* |
173
|
|
|
* @throws ArgumentNumberIncorrectException; |
174
|
9 |
|
* @throws ArgumentNotFoundException; |
175
|
|
|
* |
176
|
9 |
|
* @return bool true |
177
|
9 |
|
*/ |
178
|
3 |
|
public static function destroy($id, $dbConn) |
179
|
|
|
{ |
180
|
|
|
$numArgs = func_num_args(); |
181
|
6 |
|
if ($numArgs > 2) { |
182
|
3 |
|
throw new ArgumentNumberIncorrectException('Please input just one Argument'); |
183
|
|
|
} |
184
|
|
|
|
185
|
3 |
|
if ($numArgs == ' ') { |
186
|
|
|
throw new ArgumentNotFoundException('No Argument found, please input an argument'); |
187
|
3 |
|
} |
188
|
|
|
|
189
|
|
|
DataBaseQuery::delete($id, self::getClassName(), $dbConn); |
190
|
42 |
|
|
191
|
|
|
return true; |
192
|
42 |
|
} |
193
|
|
|
|
194
|
42 |
|
public static function getClassName() |
195
|
|
|
{ |
196
|
|
|
$tableName = explode('\\', get_called_class()); |
197
|
|
|
|
198
|
|
|
return Inflector::pluralize(strtolower(end($tableName))); |
199
|
|
|
} |
200
|
|
|
|
201
|
|
|
/** |
202
|
|
|
* This method check if the argument passed to this function is an array. |
203
|
|
|
* |
204
|
6 |
|
* @param $arrayOfRecord |
205
|
|
|
* |
206
|
6 |
|
* @return bool true |
207
|
3 |
|
*/ |
208
|
|
|
public function checkIfRecordIsEmpty($arrayOfRecord) |
209
|
|
|
{ |
210
|
3 |
|
if (count($arrayOfRecord) > 0) { |
211
|
|
|
return true; |
212
|
|
|
} |
213
|
|
|
|
214
|
|
|
return false; |
215
|
|
|
} |
216
|
|
|
} |
217
|
|
|
|
Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.
The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.
This check looks for comments that seem to be mostly valid code and reports them.