Completed
Pull Request — master (#2)
by Mathieu
05:06 queued 01:16
created

CollectionMapping::loadForParentId()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 35

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
nc 4
nop 1
dl 0
loc 35
rs 9.36
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
namespace Suricate;
3
/*
4
class CollectionMapping extends Collection
5
{
6
    const SQL_RELATION_TABLE_NAME   = '';
7
    const MAPPING_ID_NAME           = '';
8
9
    protected $additionalMappingFieldList = [];
10
11
    public static function loadForParentId($parentId)
12
    {
13
14
        $calledClass   = get_called_class();
15
        $collection     = new $calledClass;
16
17
        $itemName = $collection::ITEM_TYPE;
18
19
        $sql            = '';
20
        $sqlParams      = [];
21
22
        $sql .= "SELECT a.*";
23
        if (count($collection->additionalMappingFieldList)) {
24
            $sql .= ', b.' . implode(',b.', $collection->additionalMappingFieldList);
25
        }
26
        $sql .= " FROM `" . $collection::TABLE_NAME . "` a";
27
        $sql .= " RIGHT JOIN `" . $collection::SQL_RELATION_TABLE_NAME . "` b";
28
        $sql .= "   ON b." . $collection::MAPPING_ID_NAME . "=a." . $itemName->getTableIndex();
29
        $sql .= " WHERE";
30
        $sql .= "   " . $collection::PARENT_ID_NAME . "=:parent_id";
31
32
        $sqlParams['parent_id'] = $parentId;
33
34
        $results = Suricate::Database()->query($sql, $sqlParams)->fetchAll();
35
36
        if ($results !== false) {
37
            foreach ($results as $currentResult) {
38
                $itemName = $collection::ITEM_TYPE;
39
                $collection->addItem($itemName::buildFromArray($currentResult));
40
            }
41
        }
42
        $collection->parent_id = $parentId;
43
44
        return $collection;
45
    }
46
47
    public function setParentIdForAll($parentId)
48
    {
49
        $this->parent_id = $parentId;
50
    }
51
52
    public function save()
53
    {
54
        $dbHandler     = Suricate::Database(true);
55
56
        if ($this->parent_id != '') {
57
            // 1st step : delete all records for current parent_id
58
            $sql  = "DELETE FROM `" . static::SQL_RELATION_TABLE_NAME . "`";
59
            $sql .= " WHERE";
60
            $sql .= "   " . static::PARENT_ID_NAME . "=:parent_id";
61
62
            $sqlParams      = [];
63
            $sqlParams['parent_id'] = $this->parent_id;
64
65
            $dbHandler->query($sql, $sqlParams);
66
67
            // 2nd step : create items that are not saved in db
68
            foreach ($this->items as &$currentItem) {
69
                if ($currentItem->{$currentItem->getTableIndex()} == '') {
70
                    $currentItem->save();
71
                }
72
73
                //3rd step : create the mapping
74
                $sqlParams = [];
75
76
                $sql  = "INSERT INTO `" . static::SQL_RELATION_TABLE_NAME . "`";
77
                $sql .= " (`" . static::PARENT_ID_NAME . "`, `" . static::MAPPING_ID_NAME. "`";
78
                if (count($this->additionalMappingFieldList)) {
79
                    $sql .= ', ' . implode(
80
                        ",",
81
                        array_map(
82
                            function ($s) {
83
                                return '`' . $s . '`';
84
                            },
85
                            $this->additionalMappingFieldList
86
                        )
87
                    );
88
                }
89
                
90
                $sql .= ")";
91
                $sql .= " VALUES";
92
                $sql .= "(:parent_id, :id";
93
                if (count($this->additionalMappingFieldList)) {
94
                    foreach ($this->additionalMappingFieldList as $additionalField) {
95
                        $sql .= ',:' . $additionalField;
96
                        $sqlParams[$additionalField] = $currentItem->$additionalField;
97
                    }
98
                }
99
                
100
                $sql .= ")";
101
102
                
103
                $sqlParams['parent_id'] = $this->parent_id;
104
                $sqlParams['id']        = $currentItem->id;
105
106
                $dbHandler->query($sql, $sqlParams);
107
            }
108
        }
109
    }
110
111
    public function craftItem($itemData)
112
    {
113
        $itemName = static::ITEM_TYPE;
114
        
115
        foreach ($itemData as $data) {
116
            $newItem       = new $itemName();
117
            $hasData       = false;
118
119
            // One field contains item unique index, load from it
120
            if (isset($data[$newItem->getTableIndex()]) && $data[$newItem->getTableIndex()] != '') {
121
                $newItem->load($data[$newItem->getTableIndex()]);
122
            } else {
123
                // Build SQL query to load corresponding item
124
                $sqlData = [];
125
                
126
127
                $sql  = "SELECT *";
128
                $sql .= " FROM `" . $newItem::TABLE_NAME . "`";
129
                $sql .= " WHERE";
130
                foreach ($data as $field => $value) {
131
                    if ($newItem->isDBVariable($field)) {
132
                        $sqlData[$field] = $value;
133
                        $sql .= "   `" . $field . "`=:$field";
134
                    }
135
                }
136
137
                $newItem->loadFromSql($sql, $sqlData);
138
            }
139
140
            // Assign properties to object
141
            foreach ($data as $field => $value) {
142
                $newItem->$field = $value;
143
                $hasData = $hasData || ($value != '');
144
            }
145
            // Object is not empty, adding it to collection
146
            if ($hasData) {
147
                $this->addItem($newItem);
148
            }
149
        }
150
    }
151
}
152
*/