flyokai / laminas-db
Database abstraction layer, SQL abstraction, result set abstraction, and RowDataGateway and TableDataGateway implementations
Package info
pkg:composer/flyokai/laminas-db
Requires
- php: ^8.1
- laminas/laminas-stdlib: ^3.7.1
Requires (Dev)
- laminas/laminas-coding-standard: ^2.4.0
- laminas/laminas-eventmanager: ^3.6.0
- laminas/laminas-hydrator: ^4.7
- laminas/laminas-servicemanager: ^3.19.0
- phpunit/phpunit: ^9.5.25
Suggests
- laminas/laminas-eventmanager: Laminas\EventManager component
- laminas/laminas-hydrator: (^3.2 || ^4.3) Laminas\Hydrator component for using HydratingResultSets
- laminas/laminas-servicemanager: Laminas\ServiceManager component
Conflicts
Replaces
- laminas/laminas-db: 2.20.0
This package is auto-updated.
Last update: 2026-06-04 07:39:57 UTC
README
User docs →
README.md· Agent quick-ref →CLAUDE.md· Agent deep dive →AGENTS.md
Database abstraction layer for the Flyokai framework — fork of
laminas/laminas-db.
Provides the synchronous foundation: adapters, drivers, SQL builders, table gateways, and platform-specific dialect generation. Async behaviour is added on top by sibling packages — this fork keeps the upstream API intact.
Use
flyokai/laminas-db-driver-amp(native AMPHP MySQL) orflyokai/laminas-db-driver-async(PDO/MySQLi worker pools) on top of this package for non-blocking I/O.
Features
- Adapters & drivers — Pdo, Mysqli, Pgsql, Oci8, IbmDb2, Sqlsrv
- SQL builders —
Select,Insert,Update,Deletewith fluent, platform-agnostic API - Platform abstraction — Mysql, Postgresql, Oracle, SqlServer, Sqlite, IbmDb2, Sql92
- Predicate system — Between, EqualTo, In, IsNull, Like, …
- TableGateway —
select(),insert(),update(),delete()with a feature/plugin system - Result sets — buffered or forward-only
- Metadata — schema introspection (
MysqlMetadata,PostgresqlMetadata, …)
Installation
composer require laminas/laminas-db
Composer's replace makes this fork resolve under the upstream name automatically inside Flyokai installs.
Quick start
use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; $adapter = new Adapter([ 'driver' => 'Pdo_Mysql', 'database' => 'app', 'username' => 'app', 'password' => 'secret', 'hostname' => 'localhost', ]); $sql = new Sql($adapter); $select = $sql->select('users') ->where(['status' => 'active']) ->order('created DESC') ->limit(20); $stmt = $sql->prepareStatementForSqlObject($select); $rows = iterator_to_array($stmt->execute());
Adapter
Coordinates driver + platform + query execution.
- Query modes:
QUERY_MODE_PREPARE(parameterised) /QUERY_MODE_EXECUTE(direct) ProfilerInterfacesupport for query profiling- Factory methods:
createStatement(),createDriver(),createPlatform()
SQL builders
use Laminas\Db\Sql\Sql; $sql = new Sql($adapter); $insert = $sql->insert('users') ->columns(['email', 'name']) ->values(['a@b.com', 'Alice']); $update = $sql->update('users') ->set(['status' => 'disabled']) ->where(['email' => 'a@b.com']); $delete = $sql->delete('users')->where(['email' => 'a@b.com']);
Sql::buildSqlString($sqlObject) generates platform-aware SQL; Sql::prepareStatementForSqlObject($sqlObject) returns a prepared statement.
TableGateway
use Laminas\Db\TableGateway\TableGateway; $users = new TableGateway('users', $adapter); $users->insert(['email' => 'a@b.com', 'name' => 'Alice']); $rows = $users->select(['status' => 'active']); $users->update(['status' => 'inactive'], ['id' => 7]); $users->delete(['id' => 7]);
A FeatureSet plugs in pre/post operation hooks (e.g. metadata introspection, hydrator-based mapping).
Async integration points
Async packages extend this foundation by:
- Implementing
DriverInterface/ConnectionInterfacenon-blockingly. - Wrapping
Statement::execute()andConnection::execute()for fiber suspension. - Using the
Featuresystem inTableGatewayfor async lifecycle hooks.
See flyokai/laminas-db-driver-amp and flyokai/laminas-db-driver-async.
Gotchas
- Empty WHERE protection —
UpdateandDeletehave$emptyWhereProtection = trueby default. They refuse to run without a WHERE clause to prevent full-table operations. - Forward-only results — default is streaming. Call
buffer()on the result set to enable re-iteration. - Platform abstraction — SQL objects don't generate SQL directly; that's delegated to platform classes via
Sql::buildSqlString(). - Parameter naming — driver-specific (PostgreSQL
$1, $2vs MySQL?). UseParameterContainerfor binding. - No async in this package — use the driver-* siblings.
License
BSD-3-Clause — Copyright (c) Laminas Project. See LICENSE.md.
See also
flyokai/laminas-db-driver-amp— async viaamphp/mysqlflyokai/laminas-db-driver-async— async via worker pools /MYSQLI_ASYNCflyokai/laminas-db-bulk-update— bulk inserts, ID resolution, range chunkingflyokai/zend-db-sql-insertmultiple— multi-rowINSERT VALUES- Upstream: https://docs.laminas.dev/laminas-db/