Completed
Push — master ( 5056f5...ad3d21 )
by Adeola
02:26
created

DataBaseModel::getById()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 0
Metric Value
c 2
b 1
f 0
dl 0
loc 12
rs 9.4285
cc 3
eloc 6
nc 4
nop 1
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 $dataBaseConnection;
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
    public function __construct()
29
    {
30
        $this->tableName = self::getClassName();
31
        $this->DataBaseQuery = new DataBaseQuery(new DataBaseConnection());
32
        $this->arrayField['id'] = 0;
33
    }
34
35
    /**
36
     * The magic setter method.
37
     *
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
48
    /**
49
     * The magic getter method.
50
     *
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 = null)
69
    {
70
        if (is_null($dbConn)) {
71
            $dbConn = $this->dataBaseConnection;
0 ignored issues
show
Bug introduced by
The variable $this does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
72
        }
73
        $sqlData = DataBaseQuery::read($id = false, self::getClassName(), $dbConn);
74
75
        if (count($sqlData) > 0) {
76
            return $sqlData;
77
        }
78
79
        throw new NoDataFoundException('There is no data to display');
80
    }
81
82
    /**
83
     * This method either create or update record in a database table
84
     * by calling either the read method or create method in the
85
     * DataBaseQuery class.
86
     *
87
     * @throws NoRecordUpdateException
88
     * @throws EmptyArrayException
89
     * @throws NoRecordCreatedException
90
     *
91
     * @return bool true or false;
92
     */
93
    public function save($dbConn = null)
94
    {
95
        if (is_null($dbConn)) {
96
            $dbConn = $this->dataBaseConnection;
0 ignored issues
show
Unused Code introduced by
$dbConn is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
97
        }
98
        if ($this->arrayField['id']) {
99
            $sqlData = $this->DataBaseQuery::read($this->arrayField['id'], self::getClassName());
100
            if ($this->checkIfRecordIsEmpty($sqlData)) {
101
                $boolCommit = $this->DataBaseQuery->update(['id' => $this->arrayField['id']], $this->arrayField, self::getClassName());
102
                if ($boolCommit) {
103
                    return true;
104
                }
105
106
                throw new NoRecordUpdatedException('oops, your record did not update succesfully');
107
            }
108
109
            throw new EmptyArrayException("data passed didn't match any record");
110
        }
111
        $sqlData = $this->DataBaseQuery::read($this->arrayField['id'], self::getClassName());
0 ignored issues
show
Unused Code introduced by
$sqlData is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
112
113
        $boolCommit = $this->DataBaseQuery->create($this->arrayField, self::getClassName());
114
        if ($boolCommit) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $boolCommit of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
115
            return true;
116
        }
117
118
        throw new NoRecordCreatedException('oops,your record did not create succesfully');
119
    }
120
121
    /**
122
     * This method find a record by id.
123
     *
124
     * @param $id
125
     *
126
     * @throws ArgumentNumberIncorrectException
127
     * @throws ArgumentNotFoundException
128
     *
129
     * @return object
130
     */
131
    public static function findById($id)
132
    {
133
        $numArgs = func_num_args();
134
        if ($numArgs < 0 || $numArgs > 1) {
135
            throw new ArgumentNumberIncorrectException('Please input just one Argument');
136
        }
137
        if ($numArgs == '') {
138
            throw new ArgumentNotFoundException('No Argument found, please input an argument');
139
        }
140
141
        $staticFindInstance = new static();
142
        $staticFindInstance->id = $id == '' ? false : $id;
0 ignored issues
show
Documentation introduced by
The property id does not exist on object<Demo\DataBaseModel>. Since you implemented __set, maybe consider adding a @property annotation.

Since your code implements the magic setter _set, this function will be called for any write access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

Since the property has write access only, you can use the @property-write annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
143
144
        return $staticFindInstance;
145
    }
146
147
    /**
148
     * This method find a record by id and returns
149
     * all the data present in the id.
150
     *
151
     *
152
     * @return associative array
153
     */
154
    public function getById($dbConn = null)
155
    {
156
157
        if (is_null($dbConn)) {
158
            $dbConn = $this->dataBaseConnection;
159
        }
160
        if ($this->arrayField['id']) {
161
            $sqlData = DataBaseQuery::read($this->arrayField['id'], self::getClassName(), $dbConn);
162
163
            return $sqlData;
164
        }
165
    }
166
167
    /**
168
     * This method delete a row from the table by the row id.
169
     *
170
     * @param $id
171
     *
172
     * @throws ArgumentNumberIncorrectException;
173
     * @throws ArgumentNotFoundException;
174
     *
175
     * @return bool true
176
     */
177
    public static function destroy($id, $dbConn)
178
    {
179
        if (is_null($dbConn)) {
180
            $dbConn = $this->dataBaseConnection;
0 ignored issues
show
Bug introduced by
The variable $this does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
181
        }
182
        $numArgs = func_num_args();
183
        if ($numArgs < 0 || $numArgs > 2) {
184
            throw new ArgumentNumberIncorrectException('Please input just one Argument');
185
        }
186
        if ($numArgs == ' ') {
187
            throw new ArgumentNotFoundException('No Argument found, please input an argument');
188
        }
189
        $sqlData = DataBaseQuery::read($id, self::getClassName());
0 ignored issues
show
Unused Code introduced by
$sqlData is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
190
        $sqlData = DataBaseQuery::delete($id, self::getClassName(), $dbConn);
0 ignored issues
show
Unused Code introduced by
$sqlData is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
191
192
        return true;
193
194
        throw new IdNotFoundException('Oops, the id '.$id.' is not in the database, try another id');
0 ignored issues
show
Unused Code introduced by
throw new \Demo\IdNotFou...base, try another id'); does not seem to be reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
195
    }
196
197
    public static function getClassName()
198
    {
199
        $tableName = explode('\\', get_called_class());
200
201
        return Inflector::pluralize(strtolower(end($tableName)));
202
    }
203
204
    /**
205
     * This method check if the argument passed to this function is an array.
206
     *
207
     * @param $arrayOfRecord
208
     *
209
     * @return bool true
210
     */
211
    public function checkIfRecordIsEmpty($arrayOfRecord)
212
    {
213
        if (count($arrayOfRecord) > 0) {
214
            return true;
215
        }
216
217
        return false;
218
    }
219
220
    /**
221
     * This method check if the argument passed to this function is an array.
222
     *
223
     * @param $arrayOfRecord
224
     *
225
     * @return bool true
226
     */
227
    public function checkIfRecordExist($arrayOfRecord)
228
    {
229
        $stringValue = [];
230
        foreach ($arrayOfRecord as $key => $val) {
231
            $stringValue[] = $val;
232
        }
233
    }
234
}
235