Search by

jonatasfenske / datalayer

jonatasfenske

Abstração de persistência PHP 8.5 com QueryBuilder fluente, Soft Deletes, Relacionamentos, Casting, Transações e Eventos de lifecycle

Package info

github.com/jonatasfenske/datalayer

pkg:composer/jonatasfenske/datalayer

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-11-13 19:01 UTC

This package is auto-updated.

Last update: 2026-11-13 19:24:10 UTC


README

Abstração de persistência PHP 8.5 com QueryBuilder fluente

PHP 8.5+ MIT License

Instalação

composer require jonatasfenske/datalayer

Recursos

  • QueryBuilder fluente — where, orWhere, whereIn, whereBetween, whereNull, whereLike, join (INNER/LEFT/RIGHT), groupBy, having, orderBy, limit/offset
  • Soft Deletes — trash/restore/forceDelete/withTrashed/onlyTrashed
  • Relacionamentos — BelongsTo, HasMany, BelongsToMany com eager loading
  • Casting automático — int, float, string, boolean, json, array, datetime, date, timestamp, decimal:N
  • Transações — automática com closure e manual (begin/commit/rollback)
  • Eventos de lifecycle — beforeSave, afterSave, beforeCreate, afterCreate, beforeUpdate, afterUpdate, beforeDelete, afterDelete
  • Paginação nativa — integrada ao jonatasfenske/paginator
  • Batch insert — via QueryBuilder::insertMany()
  • DatabaseConfig — value object imutável com #[SensitiveParameter]
  • DatabaseDriver enum — DSN automático para MySQL, PostgreSQL, SQLite, SQL Server

Uso Rápido

Configuração

use JonatasFenske\DataLayer\DatabaseConfig;

$db = new DatabaseConfig(
    driver: 'mysql',
    host: 'localhost',
    dbname: 'meubanco',
    username: 'root',
    password: getenv('DB_PASS') ?: '',
);

Criando um Model

use JonatasFenske\DataLayer\DataLayer;

class User extends DataLayer
{
    protected array $casts = [
        'id' => 'integer',
        'is_active' => 'boolean',
        'metadata' => 'json',
        'created_at' => 'datetime',
    ];

    public function __construct()
    {
        parent::__construct(
            entity: 'users',
            required: ['name', 'email'],
            primary: 'id',
            timestamps: true,
        );
    }
}

CRUD

$user = new User();
$user->name = 'João Silva';
$user->email = 'joao@example.com';
$user->save(); // INSERT + reload

$found = $user->findById(1);
$found->name = 'Maria Silva';
$found->save(); // UPDATE automático

$found->destroy(); // DELETE ou soft delete

QueryBuilder

$results = $user->query()
    ->select('id', 'name', 'email')
    ->where('is_active', '=', true)
    ->whereIn('role', ['admin', 'editor'])
    ->orderByDesc('created_at')
    ->limit(20)
    ->get();

$count = $user->query()->where('is_active', '=', true)->count();

Transações

DataLayer::transaction(function () {
    $order->save();
    $payment->save();
});

Eventos

User::beforeSave(fn(User $u) => $u->slug = Str::slug($u->name));
User::afterCreate(fn(User $u) => EmailService::sendWelcome($u->email));

Testes

composer test

Licença

MIT