Query with QUEL-inspired syntax that reads like PHP. Map relationships intuitively. Build faster with ObjectQuel's elegant ORM.
See how ObjectQuel transforms database queries into readable, object-oriented code
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;
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
Modern architecture meets developer-friendly design
Write queries using intuitive, object-oriented syntax that feels natural to developers. No more complex SQL joins.
Clean separation between entities and persistence logic. Keep your domain models pure and testable.
Built on CakePHP's battle-tested database layer for reliability and performance you can trust.
Work with complex relationships without complex query code. OneToMany, ManyToOne, and more.
Multiple built-in optimization strategies for efficient database interactions including lazy loading.
Uniquely combine traditional databases with external JSON data sources in a single query interface.
Clean, readable code that gets things done
$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;
}
Everything you need for professional PHP applications
Intuitive design that makes database operations feel natural and enjoyable
Elegant ObjectQuel syntax that's more intuitive than SQL and entity-focused
Clean Data Mapper pattern ensures your entities are easily testable
Intelligent query optimization and caching strategies built-in