PHPackages                             shedeza/sybase-orm - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. shedeza/sybase-orm

ActiveLibrary[Database &amp; ORM](/categories/database)

shedeza/sybase-orm
==================

Pure PHP ORM for Sybase ASE — framework-agnostic

v4.0.1(1mo ago)0303↓90%1MITPHPPHP ^8.1CI passing

Since May 29Pushed 1mo ago1 watchersCompare

[ Source](https://github.com/shedeza/sybase-orm)[ Packagist](https://packagist.org/packages/shedeza/sybase-orm)[ RSS](/packages/shedeza-sybase-orm/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (8)Versions (31)Used By (1)

Sybase ORM
==========

[](#sybase-orm)

[![CI](https://github.com/shedeza/sybase-orm/actions/workflows/ci.yml/badge.svg)](https://github.com/shedeza/sybase-orm/actions/workflows/ci.yml)[![PHP 8.1+](https://camo.githubusercontent.com/7535257ca228724c93658bd52583d4e47a9bab02c356abf6e54c1d575f2151e6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e312532422d626c75652e737667)](https://www.php.net/)[![Licencia MIT](https://camo.githubusercontent.com/68771265fd974d8f769708a2de21c1b37cc38a0a0504025464b58225930215df/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e6369612d4d49542d677265656e2e737667)](LICENSE)[![Estado](https://camo.githubusercontent.com/d1d293019b5245b8f0bd02c73e87afb112da1688fee3d48e0bab7f7937c2c211/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f65737461646f2d65737461626c652d627269676874677265656e2e737667)](#)

ORM puro en PHP para **Sybase ASE**, independiente de framework. Soporta mapeo de entidades con atributos PHP 8.1, consultas OQL, QueryBuilder, relaciones, herencia, caché de dos niveles, migraciones y más.

> **Estado:** Este proyecto es **estable** y apto para uso en producción. Reporta cualquier problema en [Issues](https://github.com/shedeza/sybase-orm/issues).

Características
---------------

[](#características)

- Mapeo de entidades con atributos nativos de PHP 8.1 (sin XML ni YAML)
- Patrón Data Mapper con Unit of Work e Identity Map
- Lenguaje de consultas OQL y QueryBuilder fluido
- Relaciones ManyToOne, OneToMany, OneToOne, ManyToMany con lazy/eager loading
- Herencia de entidades (TPH, TPT, TPC)
- Caché de dos niveles (memoria + Redis)
- Sistema de migraciones integrado
- Soft delete declarativo
- Hooks de ciclo de vida (PrePersist, PostPersist, PreUpdate, etc.)
- Value Objects embebibles
- Conexiones múltiples con EntityManagerRegistry
- Soporte para conexiones de solo lectura
- CLI de migraciones (`bin/sybase-orm`)
- Timestamps automáticos (`#[Timestamps]`)
- Paginación con metadatos (`paginate()`)
- Query Scopes globales (`#[GlobalScope]`)
- Subqueries en QueryBuilder (`whereIn`, `whereNotIn`, `whereExists`)
- BETWEEN, NOT BETWEEN, IS NULL, LIKE, NOT LIKE en OQL y QueryBuilder
- Funciones SQL built-in (UPPER, LOWER, COALESCE, LEN, DATEADD, etc.)
- UNION / UNION ALL entre queries
- Todos los JOINs: INNER, LEFT, RIGHT, CROSS, FULL OUTER
- Serialización (`toArray()`/`toJson()`)
- Mass assignment protection (`fill()`/`forceFill()`)
- Batch processing para grandes datasets
- Native SQL mapping (`createNativeQuery()`)
- Entity listeners externos (`#[EntityListener]`)
- Read-only entities (`#[Immutable]`)
- Cache regions por entidad (`#[CacheRegion]`)
- Model factories para testing (`EntityFactory`)
- Sistema de instrumentación/profiling
- Query Explain Plan (SHOWPLAN)
- Metadata introspection
- Optimistic locking (`#[Version]`)
- Pessimistic locking (HOLDLOCK/UPDLOCK vía `LockMode`)
- Connection pooling para workers long-running
- Partial entity loading (cargar solo columnas específicas)
- Result Set Mapping para Native SQL multi-entidad
- Audit trail automático (`#[Auditable]`)
- Database seeders (`SeederInterface`)
- Validación pre-persist (length, NOT NULL, precision)
- `#[UniqueEntity]` — validación de unicidad antes de INSERT
- `#[Index]`, `#[Check]`, `#[UniqueConstraint]` — DDL constraints
- `#[Column(default: value)]` — valores por defecto
- `#[JoinColumn(onDelete: 'CASCADE')]` — FK referential actions

Requisitos del sistema
----------------------

[](#requisitos-del-sistema)

- PHP 8.1 o superior
- Extensión `ext-pdo_dblib`
- Servidor Sybase ASE

Instalación
-----------

[](#instalación)

```
composer require shedeza/sybase-orm
```

Configuración rápida
--------------------

[](#configuración-rápida)

### Configuración por array

[](#configuración-por-array)

```
use SybaseORM\ORM\OrmFactory;

$em = OrmFactory::create([
    'connection' => [
        'host'     => '192.168.1.100',
        'port'     => 5000,
        'dbname'   => 'mi_base',
        'username' => 'sa',
        'password' => 'secret',
        'charset'  => 'UTF-8',
    ],
    'entity_directories' => [__DIR__ . '/src/Entity'],
]);
```

### Configuración por URL DSN

[](#configuración-por-url-dsn)

```
use SybaseORM\ORM\OrmFactory;

$em = OrmFactory::createFromUrl(
    'sybase://sa:secret@192.168.1.100:5000/mi_base?charset=UTF-8',
    entityDirectories: [__DIR__ . '/src/Entity'],
);
```

Los caracteres especiales en la contraseña deben codificarse con URL encoding (por ejemplo, `p@ss` → `p%40ss`).

Uso básico
----------

[](#uso-básico)

### Persistir una entidad

[](#persistir-una-entidad)

```
$usuario = new Usuario();
$usuario->nombre = 'Juan';
$usuario->email = 'juan@example.com';

$em->persist($usuario);
$em->flush();
```

### Buscar por ID

[](#buscar-por-id)

```
$usuario = $em->find(Usuario::class, 1);
```

### Consultar con OQL

[](#consultar-con-oql)

```
$usuarios = $em->query(
    'SELECT u FROM Usuario u WHERE u.activo = :activo',
    ['activo' => true]
);
```

### QueryBuilder

[](#querybuilder)

```
$usuarios = $em->createQueryBuilder(Usuario::class)
    ->where('e.activo = :activo')
    ->andWhere('e.creadoEn > :fecha')
    ->setParameter('activo', true)
    ->setParameter('fecha', new \DateTime('-30 days'))
    ->orderBy('e.nombre', 'ASC')
    ->setMaxResults(10)
    ->getResult();
```

### Transacciones

[](#transacciones)

```
$em->transactional(function () use ($em) {
    $cuenta1 = $em->find(Cuenta::class, 1);
    $cuenta2 = $em->find(Cuenta::class, 2);

    $cuenta1->saldo -= 500;
    $cuenta2->saldo += 500;

    $em->flush();
});
```

Para manejo manual de transacciones:

```
$em->beginTransaction();
try {
    $em->persist($entidad);
    $em->flush();
    $em->commit();
} catch (\Throwable $e) {
    $em->rollback();
    throw $e;
}
```

### Eliminar una entidad

[](#eliminar-una-entidad)

```
$em->remove($usuario);
$em->flush();
```

Mapeo de entidades
------------------

[](#mapeo-de-entidades)

```
use SybaseORM\Attribute\Entity;
use SybaseORM\Attribute\Id;
use SybaseORM\Attribute\Column;
use SybaseORM\Attribute\GeneratedValue;

#[Entity(table: 'usuarios')]
class Usuario
{
    #[Id]
    #[GeneratedValue]
    #[Column(type: 'integer')]
    public ?int $id = null;

    #[Column(type: 'string', length: 100)]
    public string $nombre = '';

    #[Column(type: 'string', length: 255, nullable: true)]
    public ?string $email = null;

    #[Column(type: 'datetime')]
    public ?\DateTimeInterface $creadoEn = null;
}
```

Atributos PHP principales
-------------------------

[](#atributos-php-principales)

AtributoDestinoDescripción`#[Entity]`ClaseMarca una clase como entidad mapeada. Parámetros: `table`, `schema`, `repositoryClass`, `connection``#[Id]`PropiedadMarca la propiedad como clave primaria`#[Column]`PropiedadMapea una propiedad a una columna. Parámetros: `name`, `type`, `nullable`, `length`, `precision`, `scale``#[GeneratedValue]`PropiedadIndica que el valor es generado por la base de datos. Parámetro: `strategy``#[ManyToOne]`PropiedadRelación muchos-a-uno. Parámetros: `targetEntity`, `inversedBy`, `cascade`, `fetch``#[OneToMany]`PropiedadRelación uno-a-muchos. Parámetros: `targetEntity`, `mappedBy`, `cascade`, `fetch`, `orphanRemoval``#[SoftDelete]`ClaseActiva eliminación lógica. Parámetro: `column` (por defecto `deleted_at`)`#[HasLifecycleHooks]`ClaseActiva hooks de ciclo de vida en la entidadPara la lista completa de atributos (OneToOne, ManyToMany, Embedded, herencia, hooks), consulte el [manual de mapeo de entidades](docs/usuario-manual/mapeo-entidades.md).

Relaciones
----------

[](#relaciones)

El ORM soporta relaciones `#[ManyToOne]`, `#[OneToMany]`, `#[OneToOne]` y `#[ManyToMany]` con lazy loading automático mediante proxies y eager loading vía `QueryBuilder::with()`.

Para documentación detallada de relaciones, consulte el [manual de relaciones](docs/usuario-manual/relaciones.md).

Conexiones múltiples
--------------------

[](#conexiones-múltiples)

Use `EntityManagerRegistry` para gestionar conexiones a múltiples bases de datos:

```
use SybaseORM\ORM\OrmFactory;
use SybaseORM\ORM\EntityManagerRegistry;

$emDefault = OrmFactory::create(['connection' => $configDefault, 'entity_directories' => $dirs]);
$emReportes = OrmFactory::create(['connection' => $configReportes, 'entity_directories' => $dirs]);

$registry = new EntityManagerRegistry([
    'default'  => $emDefault,
    'reportes' => $emReportes,
], defaultConnection: 'default');

// Obtener un manager específico
$em = $registry->getManager('reportes');

// Obtener el manager por defecto
$em = $registry->getDefaultManager();

// Obtener el manager que gestiona una entidad (por su atributo connection)
$em = $registry->getManagerForEntity(Reporte::class);
```

Opciones de configuración
-------------------------

[](#opciones-de-configuración)

OpciónTipoValor por defectoDescripción`host``string``'localhost'`Host del servidor Sybase ASE`port``int``5000`Puerto de conexión`dbname``string`*(requerido)*Nombre de la base de datos`username``string``''`Usuario de conexión`password``string``''`Contraseña de conexión`charset``string``'UTF-8'`Charset de la conexión`persistent``bool``false`Usar conexiones persistentes`charset_conversion``bool``false`Activar conversión automática UTF-8 ↔ ISO-8859-1`read_only``bool``false`Modo solo lectura (previene escrituras)`entity_directories``string[]``[]`Directorios donde buscar entidades`entity_classes``string[]``[]`Clases de entidad explícitas`proxy_directory``string``sys_get_temp_dir() . '/sybase-orm-proxies'`Directorio para proxies generados`metadata_cache_dir``string|null``null`Directorio de caché de metadatos`redis``array|null``null`Configuración de Redis para caché L2 (ver abajo)`second_level_cache``SecondLevelCacheInterface|null``null`Instancia de caché L2 ya configurada`file_permissions``int``0o666`Permisos de archivos generados (proxies, cache)`directory_permissions``int``0o777`Permisos de directorios generados### Caché de segundo nivel (Redis)

[](#caché-de-segundo-nivel-redis)

Para activar el caché compartido entre requests:

```
$em = OrmFactory::create([
    'connection' => $connectionConfig,
    'entity_directories' => [__DIR__ . '/src/Entity'],
    'redis' => [
        'host' => '127.0.0.1',
        'port' => 6379,
        'password' => null,      // opcional
        'database' => 0,         // opcional
        'timeout' => 2.0,        // segundos
        'prefix' => 'myapp:',    // prefijo de keys
    ],
]);
```

O si ya tenés una instancia de Redis configurada:

```
use SybaseORM\Cache\RedisCacheAdapter;

$redis = new \Redis();
$redis->connect('127.0.0.1');

$em = OrmFactory::create([
    'connection' => $connectionConfig,
    'entity_directories' => [__DIR__ . '/src/Entity'],
    'second_level_cache' => new RedisCacheAdapter($redis),
]);
```

Documentación completa
----------------------

[](#documentación-completa)

- [Documentación completa](docs/README.md) — Punto de entrada central a toda la documentación
- [Manual de usuario](docs/usuario-manual/README.md) — Guía detallada de cada módulo del ORM
- [Manual de operación](docs/manual-operacion/README.md) — Despliegue, optimización y troubleshooting
- [Manual técnico](docs/manual-tecnico/README.md) — Arquitectura interna, patrones y extensibilidad

Contribuir
----------

[](#contribuir)

Las contribuciones son bienvenidas. Antes de enviar un PR, consulta la [guía de contribución](docs/manual-tecnico/guias-contribucion.md) para conocer el flujo de trabajo, estándares de código y convenciones del proyecto.

```
# Ejecutar tests
composer test

# Análisis estático
composer phpstan

# Formateo de código
composer cs-fix
```

CLI
---

[](#cli)

```
php bin/sybase-orm help               # Show all commands

# Migrations
php bin/sybase-orm migrate            # Run pending migrations
php bin/sybase-orm migrate:rollback   # Rollback last migration
php bin/sybase-orm migrate:status     # Show migration status
php bin/sybase-orm migrate:generate   # Generate migration from entity diff
php bin/sybase-orm migrate:preview    # Preview SQL without executing
php bin/sybase-orm migrate:fresh      # Drop all + re-run (requires --force)
php bin/sybase-orm migrate:reset      # Rollback ALL migrations (requires --force)

# Generators
php bin/sybase-orm make:migration     # Auto-diff entities vs DB, generate migration
php bin/sybase-orm make:migration --empty  # Create empty migration for manual SQL
php bin/sybase-orm make:entity User   # Generate entity class skeleton

# Schema & Cache
php bin/sybase-orm schema:validate    # Validate mapping vs DB schema
php bin/sybase-orm cache:clear        # Clear proxy and metadata caches
php bin/sybase-orm orm:info           # Show all mapped entities
```

Seeders
-------

[](#seeders)

```
use SybaseORM\Testing\SeederInterface;

class UserSeeder implements SeederInterface {
    public function run(\SybaseORM\ORM\EntityManagerInterface $em): void {
        $user = new User();
        $user->email = 'admin@app.com';
        $em->persist($user);
        $em->flush();
    }
}

// Run seeders
$runner = new \SybaseORM\Testing\SeederRunner($em);
$runner->run([new UserSeeder(), new ProductSeeder()]);
```

Licencia
--------

[](#licencia)

Este proyecto está licenciado bajo la [Licencia MIT](LICENSE).

###  Health Score

46

—

FairBetter than 92% of packages

Maintenance94

Actively maintained with recent releases

Popularity17

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 95.5% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

28

Last Release

32d ago

Major Versions

2.9.0 → 3.0.02026-06-03

v3.9.1 → v4.0.02026-06-22

### Community

Maintainers

![](https://www.gravatar.com/avatar/543d28c64f4a442417184b1ad56868b1f42c47263c8954475a418599e8e36263?d=identicon)[shedeza](/maintainers/shedeza)

---

Top Contributors

[![rhoggs-bot-test-account](https://avatars.githubusercontent.com/u/22551806?v=4)](https://github.com/rhoggs-bot-test-account "rhoggs-bot-test-account (42 commits)")[![shedeza](https://avatars.githubusercontent.com/u/92833513?v=4)](https://github.com/shedeza "shedeza (2 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/shedeza-sybase-orm/health.svg)

```
[![Health](https://phpackages.com/badges/shedeza-sybase-orm/health.svg)](https://phpackages.com/packages/shedeza-sybase-orm)
```

###  Alternatives

[matomo/matomo

Matomo is the leading Free/Libre open analytics platform

21.7k38.9k](/packages/matomo-matomo)[kimai/kimai

Kimai - Time Tracking

4.8k9.0k1](/packages/kimai-kimai)[cycle/database

DBAL, schema introspection, migration and pagination

71777.8k63](/packages/cycle-database)[api-platform/metadata

API Resource-oriented metadata attributes and factories

295.0M223](/packages/api-platform-metadata)[symfony/ai-store

Low-level abstraction for storing and retrieving documents in a vector store.

22400.9k114](/packages/symfony-ai-store)[perplorm/perpl

Perpl is an improved and still maintained fork of Propel2, an open-source Object-Relational Mapping (ORM) for PHP.

2411.8k](/packages/perplorm-perpl)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
