CrudTrait   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 92
Duplicated Lines 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 13
eloc 42
c 3
b 0
f 0
dl 0
loc 92
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A filter() 0 7 3
A update() 0 20 4
A delete() 0 15 3
A create() 0 18 3
1
<?php
2
3
namespace CoffeeCode\DataLayer;
4
5
use DateTime;
6
use PDOException;
7
8
/**
9
 * Trait CrudTrait
10
 * @package CoffeeCode\DataLayer
11
 */
12
trait CrudTrait
13
{
14
    /**
15
     * @param array $data
16
     * @return int|null
17
     * @throws PDOException
18
     */
19
    protected function create(array $data): ?int
20
    {
21
        if ($this->timestamps) {
22
            $data["created_at"] = (new DateTime("now"))->format("Y-m-d H:i:s");
23
            $data["updated_at"] = $data["created_at"];
24
        }
25
26
        try {
27
            $columns = implode(", ", array_keys($data));
28
            $values = ":" . implode(", :", array_keys($data));
29
30
            $stmt = Connect::getInstance($this->database)->prepare("INSERT INTO {$this->entity} ({$columns}) VALUES ({$values})");
31
            $stmt->execute($this->filter($data));
32
33
            return Connect::getInstance($this->database)->lastInsertId();
0 ignored issues
show
Bug Best Practice introduced by
The expression return CoffeeCode\DataLa...tabase)->lastInsertId() returns the type string which is incompatible with the type-hinted return integer|null.
Loading history...
34
        } catch (PDOException $exception) {
35
            $this->fail = $exception;
0 ignored issues
show
Bug Best Practice introduced by
The property fail does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
36
            return null;
37
        }
38
    }
39
40
    /**
41
     * @param array $data
42
     * @param string $terms
43
     * @param string $params
44
     * @return int|null
45
     * @throws PDOException
46
     */
47
    protected function update(array $data, string $terms, string $params): ?int
48
    {
49
        if ($this->timestamps) {
50
            $data["updated_at"] = (new DateTime("now"))->format("Y-m-d H:i:s");
51
        }
52
53
        try {
54
            $dateSet = [];
55
            foreach ($data as $bind => $value) {
56
                $dateSet[] = "{$bind} = :{$bind}";
57
            }
58
            $dateSet = implode(", ", $dateSet);
59
            parse_str($params, $params);
0 ignored issues
show
Bug introduced by
$params of type string is incompatible with the type array expected by parameter $result of parse_str(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

59
            parse_str($params, /** @scrutinizer ignore-type */ $params);
Loading history...
60
61
            $stmt = Connect::getInstance($this->database)->prepare("UPDATE {$this->entity} SET {$dateSet} WHERE {$terms}");
62
            $stmt->execute($this->filter(array_merge($data, $params)));
63
            return $stmt->rowCount();
64
        } catch (PDOException $exception) {
65
            $this->fail = $exception;
0 ignored issues
show
Bug Best Practice introduced by
The property fail does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
66
            return null;
67
        }
68
    }
69
70
    /**
71
     * @param string $terms
72
     * @param string|null $params
73
     * @return bool
74
     */
75
    public function delete(string $terms, ?string $params): bool
76
    {
77
        try {
78
            $stmt = Connect::getInstance($this->database)->prepare("DELETE FROM {$this->entity} WHERE {$terms}");
79
            if ($params) {
80
                parse_str($params, $params);
0 ignored issues
show
Bug introduced by
$params of type string is incompatible with the type array expected by parameter $result of parse_str(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

80
                parse_str($params, /** @scrutinizer ignore-type */ $params);
Loading history...
81
                $stmt->execute($params);
82
                return true;
83
            }
84
85
            $stmt->execute();
86
            return true;
87
        } catch (PDOException $exception) {
88
            $this->fail = $exception;
0 ignored issues
show
Bug Best Practice introduced by
The property fail does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
89
            return false;
90
        }
91
    }
92
93
    /**
94
     * @param array $data
95
     * @return array|null
96
     */
97
    private function filter(array $data): ?array
98
    {
99
        $filter = [];
100
        foreach ($data as $key => $value) {
101
            $filter[$key] = (is_null($value) ? null : filter_var($value, FILTER_DEFAULT));
102
        }
103
        return $filter;
104
    }
105
}