Saltar al contenido principal

🗄️ ORM Básico para MySQL

ORM ligero para MySQL con QueryBuilder fluent, Model base y soporte multi-tenancy.

📋 Contexto​

Un ORM completo puede ser excesivo. Este ORM proporciona lo esencial sin magia oculta.

🎯 Objetivo​

Proporcionar ORM simple con:

  • QueryBuilder fluent
  • Model base con CRUD
  • Multi-tenancy por columna
  • Sin dependencias pesadas

📦 Alcance​

Incluye:

  • Conexión PDO
  • QueryBuilder
  • Model base
  • Configuración

🏛️ Estructura​

bootzen-orm/
├── src/
│ ├── BootZen/ORM/
│ │ ├── Connection.php
│ │ ├── QueryBuilder.php
│ │ ├── Model.php
│ │ └── Config.php
├── tests/
├── composer.json
└── README.md

⚙️ Instalación​

{
"name": "bootzen/orm",
"require": {
"php": ">=8.2",
"ext-pdo": "*"
},
"autoload": {
"psr-4": {
"BootZen\\ORM\\": "src/BootZen/ORM/"
}
}
}

🔧 Configuración​

use BootZen\ORM\Config;

$config = new Config(
host: 'localhost',
database: 'bootzen',
username: 'root',
password: 'secret',
currentTenantId: 1 // Opcional: para multitenancy
);

🗄️ QueryBuilder​

use BootZen\ORM\QueryBuilder;

$query = new QueryBuilder('users');

// Select
$users = $query
->select(['id', 'name', 'email'])
->where('active', '=', true)
->orderBy('created_at', 'DESC')
->limit(10)
->get();

// Insert
$query->insert([
'name' => 'Arturo',
'email' => '[email protected]'
]);

// Update
$query
->where('id', '=', 1)
->update(['name' => 'Arturo López']);

📝 Model Base​

use BootZen\ORM\Model;

class User extends Model {
protected string $table = 'users';
protected bool $useTenant = true; // Aplica filtro tenant_id
protected array $fillable = ['name', 'email'];
protected ?string $deletedAtColumn = 'deleted_at'; // Soft delete

// Métodos disponibles
public static function find(int $id): ?static;
public static function all(): array;
public function save(): bool;
public function delete(): bool;
}

Uso del Model​

// Crear
$user = new User();
$user->name = 'Arturo';
$user->email = '[email protected]';
$user->save();

// Buscar
$user = User::find(1);

// Listar
$users = User::all();

// Soft delete
$user->delete(); // Actualiza deleted_at

// Query con scope de tenant
$users = User::query()
->where('active', true)
->get();
// Automáticamente añade: WHERE tenant_id = 1

🔐 Multi-tenancy​

Por Columna (tenant_id)​

// Configurar tenant actual
$config = new Config(
// ...
currentTenantId: $_SESSION['tenant_id'] ?? null
);

// En modelos habilitados
class Product extends Model {
protected bool $useTenant = true;
}

// Todas las consultas incluyen: WHERE tenant_id = ?

✅ Checklist​

  • QueryBuilder soporta SELECT, INSERT, UPDATE, DELETE
  • Soft deletes funcionan
  • Multi-tenancy aplica filtros automáticos
  • Model base tiene CRUD completo
  • Tests unitarios pasan

📚 Referencias​