Modern PHP ORM & Data Mapper

Stop Writing SQL. Start Thinking Objects.

Query with QUEL-inspired syntax that reads like PHP. Map relationships intuitively. Build faster with ObjectQuel's elegant ORM.


From Complex SQL to Elegant ObjectQuel

See how ObjectQuel transforms database queries into readable, object-oriented code

Before
Traditional SQL
SELECT p.*, c.name as category_name
FROM products p
LEFT JOIN categories c ON p.product_id = p.id
WHERE p.price < 100.00
  AND c.active = 1
  AND p.name LIKE 'widget%'
ORDER BY p.name ASC
LIMIT 10 OFFSET 0;
After
ObjectQuel Language
range of p is ProductEntity
range of c is CategoryEntity via p.categories
retrieve (p, category_name=c.name)
where p.price < :maxPrice
  and c.active = true
  and p.name = "widget*"
sort by p.name asc
window 0 using window_size 10


Why Choose ObjectQuel?

Modern architecture meets developer-friendly design

๐ŸŽฏ Entity-Based Query Language

Write queries using intuitive, object-oriented syntax that feels natural to developers. No more complex SQL joins.

๐Ÿ—๏ธ Data Mapper Architecture

Clean separation between entities and persistence logic. Keep your domain models pure and testable.

โšก Powered by CakePHP

Built on CakePHP's battle-tested database layer for reliability and performance you can trust.

๐Ÿ”— Relationship Simplicity

Work with complex relationships without complex query code. OneToMany, ManyToOne, and more.

๐Ÿš€ Performance by Design

Multiple built-in optimization strategies for efficient database interactions including lazy loading.

๐Ÿ”€ Hybrid Data Sources

Uniquely combine traditional databases with external JSON data sources in a single query interface.

See ObjectQuel in Action

Clean, readable code that gets things done

  • Quick Setup
  • Query Language
  • Entity Definition
$config = new Configuration();
$config->setDsn('mysql://user:pass@localhost/db');
$config->setEntityPath(__DIR__ . '/Entities/');
$config->setEntityNamespace('App\\Entity');

// 3. Create EntityManager
$entityManager = new EntityManager($config);

// 4. Start building amazing apps!
$product = $entityManager->find(ProductEntity::class, 101);
// Powerful, readable queries
$results = $entityManager->executeQuery("
    range of p is ProductEntity
    range of c is CategoryEntity via p.categories
    retrieve (p, c.name)
    where p.price < :maxPrice and c.active = true
    sort by p.name asc
    window 1 using window_size 10
", ['maxPrice' => 100.00]);

// Advanced search operations
$products = $entityManager->executeQuery("
    range of p is App\\Entity\\ProductEntity
    retrieve (p) where p.name = \"widget*\"  // starts with
                   or p.code = /^[A-Z]3/   // regex
");
/**
 * @Orm\Table(name="products")
 * @Orm\Index(name="idx_product_category", columns=category_id)
 */
class ProductEntity {
    /**
     * @Orm\Column(name="id", type="integer", primary_key=true)
     * @Orm\PrimaryKeyStrategy(strategy="identity")
     */
    private ?int $id = null;

    /**
     * @Orm\ManyToOne(targetEntity="CategoryEntity")
     * @Orm\RequiredRelation
     */
    private ?CategoryEntity $category;
}

Built for Modern Development

Everything you need for professional PHP applications

๐ŸŽจ
Developer Experience

Intuitive design that makes database operations feel natural and enjoyable

๐Ÿ’ฌ
Query Language

Elegant ObjectQuel syntax that's more intuitive than SQL and entity-focused

๐Ÿงช
Testability

Clean Data Mapper pattern ensures your entities are easily testable

๐Ÿ“Š
Performance

Intelligent query optimization and caching strategies built-in