db = $database->getConnection(); $this->table = $table; if (!is_subclass_of($entityClass, BaseEntity::class)) { throw new Exception("La clase de entidad debe extender de BaseEntity."); } $this->entityClass = $entityClass; $this->primaryKey = $entityClass::getPrimaryKey(); } /** * Obtiene todas las filas de la tabla. * * @return array */ public function getAll(): array { return $this->db->select($this->table, "*"); } /** * Encuentra una fila por un campo específico. * * @param string $field Campo por el cual buscar. * @param mixed $value Valor del campo. * * @return array|null */ public function findBy(string $field, $value): ?array { return $this->db->get($this->table, "*", [$field => $value]); } /** * Encuentra una fila por su ID. * * @param mixed $id Identificador de la fila. * * @return array|null */ public function findById($id): ?array { return $this->db->get($this->table, "*", [$this->primaryKey => $id]); } /** * Inserta una fila en la tabla. * * @param array $data Datos a insertar. * * @return bool|int */ public function insert(array $data): int|false { try { $this->db->insert($this->table, $data); $lastInsertId = (int) $this->db->id(); if ($lastInsertId) { return $lastInsertId; } else { error_log("Error al insertar en la tabla {$this->table}: " . print_r($this->db->error(), true)); return false; } } catch (Exception $e) { // Registra el error de la excepción error_log("Excepción al insertar en la tabla {$this->table}: " . $e->getMessage()); return false; } } /** * Actualiza una fila por su ID. * * @param mixed $id Identificador de la fila a actualizar. * @param array $data Datos a actualizar. * * @return bool */ public function update($id, array $data): bool { return $this->db->update($this->table, $data, [ $this->primaryKey => $id, ])->rowCount() > 0; } /** * Elimina una fila por su ID. * * @param mixed $id Identificador de la fila a eliminar. * * @return bool */ public function delete($id): bool { return $this->db->delete($this->table, [$this->primaryKey => $id])->rowCount() > 0; } /** * Marca una fila como inactiva (soft delete). * * @param mixed $id Identificador de la fila. * * @return bool */ public function deleteActive($id): bool { return $this->db->update( $this->table, ["active" => false], [$this->primaryKey => $id] )->rowCount() > 0; } /** * Obtiene una lista paginada de filas. * * @param int $page Número de página. * @param int $perPage Número de filas por página. * * @return array */ public function getPaginated(int $page, int $perPage): array { $perPage = min($perPage, 100); $offset = ($page - 1) * $perPage; return $this->db->select($this->table, "*", [ "LIMIT" => [$offset, $perPage], ]); } /** * Cuenta el total de filas en la tabla. * * @return int */ public function countAll(): int { return $this->db->count($this->table); } /** * Inicia una transacción. */ public function beginTransaction() { $this->db->pdo->beginTransaction(); } /** * Confirma la transacción. */ public function commit() { $this->db->pdo->commit(); } /** * Revierte la transacción. */ public function rollBack() { if ($this->db->pdo->inTransaction()) { $this->db->pdo->rollBack(); } } }