🗄️ 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