Skip to content

Commit ead91fe

Browse files
committed
Refactoriza múltiples componentes de la capa de datos para mejorar consistencia y manejo de excepciones:
- Corrige la prioridad de configuración en opciones de PDO en `AbstractDriver`. - Elimina el límite fijo en la eliminación de registros en `TableEntity::delete`. - Introduce validación para arrays vacíos en cláusulas IN y expande placeholders dinámicamente en `WhereClause`. - Cambia la visibilidad de `EntityManager::detectChanges` a pública para mayor flexibilidad.
1 parent 802e411 commit ead91fe

File tree

4 files changed

+26
-6
lines changed

4 files changed

+26
-6
lines changed

src/Drivers/AbstractDriver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public function getPDOOptions(array $config): array {
5959
PDO::ATTR_STRINGIFY_FETCHES => false,
6060
];
6161

62-
return array_merge($defaults, $config['options'] ?? []);
62+
return ($config['options'] ?? []) + $defaults;
6363
}
6464

6565
/**

src/Entity/EntityManager.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ protected function markDirty(string $field): void {
262262
*
263263
* @return void
264264
*/
265-
protected function detectChanges(): void {
265+
public function detectChanges(): void {
266266
$current = $this->toArray();
267267

268268
foreach ($current as $key => $value) {

src/Entity/TableEntity.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ public function remove(): bool {
280280
}
281281

282282
$where = $this->buildPkWhere();
283-
$deleted = static::delete($where, 1);
283+
$deleted = static::delete($where);
284284

285285
return $deleted > 0;
286286
}

src/QueryBuilder/Clauses/WhereClause.php

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,20 +127,40 @@ protected function addArrayConditions(array $conditions, string $operator): void
127127
*
128128
* Permite agregar condiciones SQL personalizadas con placeholders.
129129
* Los valores para los placeholders se proporcionan en el parámetro $params.
130+
* Maneja automáticamente arrays para cláusulas IN expandiendo los placeholders.
130131
*
131132
* @param string $condition Condición SQL con placeholders (?)
132133
* @param string $operator Operador lógico para concatenar con condiciones existentes
133134
* @param array $params Valores que reemplazarán los placeholders
134135
* @return void
136+
* @throws InvalidArgumentException Si se usa IN con array vacío
135137
*/
136138
protected function addStringCondition(string $condition, string $operator, array $params): void {
139+
$sql = $condition;
140+
$bindings = $params;
141+
142+
// Si el primer parámetro es un array y la condición contiene IN, expandir placeholders
143+
if (!empty($params) && is_array($params[0]) && stripos($condition, 'IN') !== false) {
144+
$array = $params[0];
145+
146+
if (empty($array)) {
147+
throw new InvalidArgumentException(
148+
'IN clause cannot have an empty array. Use "1=0" or equivalent for always-false conditions.'
149+
);
150+
}
151+
152+
$placeholders = implode(', ', array_fill(0, count($array), '?'));
153+
$sql = str_replace('?', "($placeholders)", $condition);
154+
$bindings = $array;
155+
}
156+
137157
$this->conditions[] = [
138-
'sql' => $condition,
158+
'sql' => $sql,
139159
'operator' => $operator,
140-
'bindings' => $params
160+
'bindings' => $bindings
141161
];
142162

143-
$this->bindings = array_merge($this->bindings, $params);
163+
$this->bindings = array_merge($this->bindings, $bindings);
144164
}
145165

146166
/**

0 commit comments

Comments
 (0)