-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRows.php
201 lines (154 loc) · 5.31 KB
/
Rows.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
<?php
declare(strict_types=1);
/*
* This file is part of the QuidPHP package <https://quidphp.com>
* Author: Pierre-Philippe Emond <emondpph@gmail.com>
* License: https://github.com/quidphp/orm/blob/master/LICENSE
*/
namespace Quid\Orm;
use Quid\Base;
// rows
// class for a collection of many rows within a same table
class Rows extends RowsMap
{
// config
protected static array $config = [];
// dynamique
protected ?array $mapAllow = ['add','unset','remove','empty','filter','sort','clone']; // méthodes permises
protected ?string $mapSortDefault = 'primary'; // défini la méthode pour sort par défaut
// onPrepareKey
// prepare une clé pour les méthodes qui soumette une clé
// peut fournir un tableau qui sera utilisé comme where
final protected function onPrepareKey($key)
{
$return = null;
if(is_int($key))
$return = $key;
elseif($key instanceof Row)
$return = $key->primary();
elseif($key instanceof Cell)
$return = $key->row()->primary();
elseif(is_array($key))
$return = $this->findKey(fn($v) => $v->cells()->isWhere($key));
else
$return = parent::onPrepareKey($key);
return $return;
}
// hasCell
// retourne vrai si toutes les lignes dans l'objet ont la cellule
public function hasCell($key):bool
{
$first = $this->first();
return !empty($first) && $first->hasCell($key);
}
// isTable
// retourne vrai si la row contient des éléments de cette table
public function isTable($value):bool
{
$table = $this->table();
return !empty($table) && ((is_object($value) && $value === $table) || (is_string($value) && $value === $table->name()));
}
// table
// retourne la table des rows
final public function table():?Table
{
$return = null;
$first = $this->first();
if(!empty($first))
$return = $first->table();
return $return;
}
// addMode
// ajoute une ou plusieurs rows dans l'objet
// valeurs doivent être des objets row
// possible de fournir un objet rows
// deux objets identiques ne peuvent pas être ajoutés dans rows
// des objets de différentes tables ne peuvent être ajoutés dans rows
// un mode doit être spécifié en premier argument (inOrder ou ordre d'ajout)
final protected function addMode(bool $inOrder=false,...$values):self
{
$this->checkAllowed('add');
$values = $this->prepareValues(...$values);
$firstTable = $this->table();
$data =& $this->arr();
if($inOrder === true)
$this->sortDefault();
foreach ($values as $value)
{
if(!$value instanceof Row)
static::throw('requiresRow');
$table = $value->table();
$firstTable = $firstTable ?: $table;
if($table !== $firstTable)
static::throw('rowMustBeFromSameTable');
$primary = $value->primary();
if(array_key_exists($primary,$data))
static::throw('rowAlreadyIn',$primary);
if($inOrder === true)
$data = Base\Arr::insertInOrder([$primary=>$value],$data);
else
$data[$primary] = $value;
}
return $this->checkAfter();
}
// add
// ajoute une ou plusieurs rows dans l'objet
// possible de fournir un objet rows
// l'ordre d'ajout des rows est gardé intacte, aucune sort
public function add(...$values):self
{
return $this->addMode(false,...$values);
}
// addSort
// ajoute une ou plusieurs rows dans l'objet
// possible de fournir un objet rows
// les rows sont toujours ajoutés dans l'ordre naturel des ids, donc si la row 1 est ajouté après la 3 elle aura quand même la première position
final public function addSort(...$values):self
{
return $this->addMode(true,...$values);
}
// alive
// retourne vrai si toutes les lignes existent, fait une requête pour la table
public function alive():bool
{
$return = false;
$table = $this->table();
$ids = $this->keys();
if(!empty($table) && !empty($ids))
{
$db = $table->db();
$count = $db->selectCount($table,$ids);
$return = ($count === $this->count());
}
return $return;
}
// refresh
// rafraichit les lignes, fait une requête pour la table
public function refresh():self
{
$table = $this->table();
$ids = $this->keys();
if(!empty($table) && !empty($ids))
{
$db = $table->db();
$assocs = $db->selectAllsPrimary($table,$ids);
if(!empty($assocs))
{
foreach ($assocs as $id => $values)
{
$row = $this->get($id);
if(!empty($row))
$row->cellsRefresh($values);
}
}
}
return $this->checkAfter();
}
// getOverloadKeyPrepend
// retourne le prepend de la clé à utiliser pour le tableau overload
final public static function getOverloadKeyPrepend():?string
{
return (static::class !== self::class && !Base\Fqcn::sameName(static::class,self::class))? 'Rows':null;
}
}
?>