Skip to content

πŸ“‘ simple database abstraction interface with OOP query builder and a mock implementation for easy testing

Notifications You must be signed in to change notification settings

leven-framework/dba-common

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

10 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Leven Database Adapter Interface

Features

  • πŸ§ͺ abstract access to the database
  • πŸ— simple query builder with nested conditions support
  • πŸ” automatic escaping of table and column names and values

Usage examples

Select

$result = $db->select('foo_table')
    ->columns('id', 'name') // optional, defaults to all columns
    ->where('id', '>', 1)->orWhere('age', '>', 22)
    ->orWhere(fn(\Leven\DBA\Common\BuilderPart\WhereGroup $w) => $w
        ->where('name', 'IN', ['Foo', 'Bar'])
        ->andWhere('description', 'LIKE', '%foo%')
    )
    ->orderDesc('id')->orderAsc('name')
    ->limit(1)->offset(1)
    ->execute();

foreach($result as $row) {} // you can iterate over the rows
$result->rows; // or access the rows as an array
$result->count; // count of rows returned

Insert

$result = $db->insert('foo_table', ['name' => 'Foo']);

$result->lastId; // last inserted id (auto increment) or null

Update

$db->update('foo_table')
    ->set('name', 'Foo')
    ->where('id', '!=', 3)
    ->limit(10)
    ->execute();

Delete

$db->delete('foo_table')
    ->where('id', 5)
    ->limit(11)
    ->execute();

Implementations

composer require leven-framework/dba-mysql
require 'vendor/autoload.php';

// all arguments are optional except for database
$db = new \Leven\DBA\MySQL\MySQLAdapter(
    database: 'example',
    user: 'username',
    password: 'password',
    host: 'localhost',
    port: 3306,
    charset: 'utf8',
    tablePrefix: 'prefix_'
);

// or use an existing PDO instance
$db = new \Leven\DBA\MySQL\MySQLAdapter($pdo);
composer require leven-framework/dba-mock
require 'vendor/autoload.php';

// saving and loading the database in JSON is slow but useful for development
$db = new \Leven\DBA\Mock\MockAdapter(
    fn() => json_decode(file_get_contents('db.json'), true),
    fn(\Leven\DBA\Mock\Structure\Database $db) => file_put_contents('db.json', json_encode($db->toArray(), JSON_PRETTY_PRINT))
);

// first argument can also be an array representing the database
$dbArray = [
    'foo_table' => [
        ['id' => 'int', 'name' => 'varchar'],
        [1, 'Foo'],
        [2, 'Bar'],
    ],
];