shedeza/sybase-orm

Pure PHP ORM for Sybase ASE — framework-agnostic

Maintainers

Package info

github.com/shedeza/sybase-orm

pkg:composer/shedeza/sybase-orm

Statistics

Installs: 64

Dependents: 1

Suggesters: 0

Stars: 0

Open Issues: 0

3.0.0 2026-06-03 21:14 UTC

This package is auto-updated.

Last update: 2026-06-03 23:30:14 UTC


README

A pure PHP ORM for Sybase ASE — framework-agnostic, zero Symfony dependencies.

Use it standalone, with Laravel, Slim, or any PHP project. Requires only ext-pdo_dblib and psr/log.

Installation

composer require shedeza/sybase-orm

Requirements

  • PHP 8.1+
  • ext-pdo_dblib

Quick Start

Array-based configuration

<?php

use SybaseORM\ORM\OrmFactory;

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

URL-based configuration

<?php

use SybaseORM\ORM\OrmFactory;

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

Connection Configuration

Array-based

All available connection options:

$em = OrmFactory::create([
    'connection' => [
        'host' => '192.168.1.100',       // Required: database host
        'port' => 5000,                   // Optional: defaults to 5000
        'dbname' => 'my_database',        // Required: database name
        'username' => 'sa',              // Required: database user
        'password' => 'secret',          // Optional: user password
        'charset' => 'UTF-8',            // Optional: defaults to UTF-8
        'persistent' => false,           // Optional: use persistent connections
        'charset_conversion' => false,   // Optional: UTF-8 ↔ ISO-8859-1 conversion
        'read_only' => false,            // Optional: read-only mode
    ],
    'entity_directories' => [__DIR__ . '/src/Entity'],
    'proxy_directory' => __DIR__ . '/var/proxies',
    'metadata_cache_dir' => __DIR__ . '/var/cache/metadata',
]);

URL-based

The URL format follows the pattern:

sybase://username:password@host:port/dbname?charset=UTF-8&persistent=true&charset_conversion=false&read_only=false

Examples:

// Basic connection
$em = OrmFactory::createFromUrl('sybase://sa:secret@localhost:5000/my_database');

// With all query options
$em = OrmFactory::createFromUrl(
    'sybase://admin:p%40ssw0rd@db.example.com:5000/production?charset=UTF-8&persistent=true&charset_conversion=true&read_only=false',
    entityDirectories: [__DIR__ . '/src/Entity'],
);

Passwords with special characters should be URL-encoded (e.g., p@ssp%40ss).

Usage Examples

Persist a new entity

$user = new User();
$user->name = 'John Doe';
$user->email = 'john@example.com';

$em->persist($user);
$em->flush();

// After flush, $user->id is populated with the generated value

Find an entity by ID

$user = $em->find(User::class, 1);

if ($user !== null) {
    echo $user->name; // "John Doe"
}

Update an entity

$user = $em->find(User::class, 1);
$user->email = 'newemail@example.com';

$em->flush(); // UnitOfWork detects dirty properties automatically

Remove an entity

$user = $em->find(User::class, 1);

$em->remove($user);
$em->flush();

Query with OQL

OQL (Object Query Language) lets you query entities using their class names and properties:

// Find all active users
$users = $em->query(
    'SELECT u FROM User u WHERE u.active = :active',
    ['active' => true],
);

// Single result
$user = $em->queryOne(
    'SELECT u FROM User u WHERE u.email = :email',
    ['email' => 'john@example.com'],
);

// Scalar value
$count = $em->queryScalar('SELECT COUNT(u) FROM User u');

// Streaming large result sets
foreach ($em->queryIterator('SELECT u FROM User u') as $user) {
    // Process one entity at a time without loading all into memory
}

QueryBuilder

$users = $em->createQueryBuilder(User::class)
    ->where('active = :active')
    ->andWhere('createdAt > :date')
    ->orderBy('name', 'ASC')
    ->setParameter('active', true)
    ->setParameter('date', new \DateTime('-30 days'))
    ->setMaxResults(10)
    ->getResult();

Entity Mapping

Define entities using PHP 8.1 attributes:

<?php

declare(strict_types=1);

namespace App\Entity;

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

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

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

    #[Column(type: 'string', length: 255, unique: true)]
    public string $email;

    #[Column(type: 'boolean')]
    public bool $active = true;

    #[Column(type: 'datetime', nullable: true)]
    public ?\DateTime $createdAt = null;
}

Available attributes

Attribute Purpose
#[Entity(table: '...')] Maps a class to a database table
#[Column(type: '...')] Maps a property to a column
#[Id] Marks the primary key property
#[GeneratedValue] Indicates the ID is auto-generated
#[ManyToOne] Many-to-one relationship
#[OneToMany] One-to-many relationship
#[OneToOne] One-to-one relationship
#[ManyToMany] Many-to-many relationship
#[JoinColumn] Configures join column for relationships

Multiple Connections

Use EntityManagerRegistry to manage multiple database connections:

<?php

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

// Create EntityManagers for each database
$defaultEm = OrmFactory::create([
    'connection' => [
        'host' => 'db1.example.com',
        'port' => 5000,
        'dbname' => 'primary_db',
        'username' => 'sa',
        'password' => 'secret',
    ],
    'entity_directories' => [__DIR__ . '/src/Entity/Primary'],
]);

$analyticsEm = OrmFactory::create([
    'connection' => [
        'host' => 'db2.example.com',
        'port' => 5000,
        'dbname' => 'analytics_db',
        'username' => 'reader',
        'password' => 'readonly',
    ],
    'entity_directories' => [__DIR__ . '/src/Entity/Analytics'],
]);

// Register them in the registry
$registry = new EntityManagerRegistry(
    managers: ['default' => $defaultEm, 'analytics' => $analyticsEm],
    defaultConnection: 'default',
);

// Retrieve by name
$em = $registry->getManager('analytics');

// Or get the default
$em = $registry->getDefaultManager();

License

MIT