PHPackages                             maxim-oleinik/blade-database - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. maxim-oleinik/blade-database

ActiveLibrary[Database &amp; ORM](/categories/database)

maxim-oleinik/blade-database
============================

PHP Database interface library

0.3.0(6y ago)02.6k↓68%1MITPHPPHP &gt;=7.0

Since Jul 11Pushed 6y ago1 watchersCompare

[ Source](https://github.com/maxim-oleinik/blade-database)[ Packagist](https://packagist.org/packages/maxim-oleinik/blade-database)[ RSS](/packages/maxim-oleinik-blade-database/feed)WikiDiscussions master Synced yesterday

READMEChangelogDependencies (1)Versions (7)Used By (1)

Blade Database Adapter
======================

[](#blade-database-adapter)

[![Latest Stable Version](https://camo.githubusercontent.com/e97e539499ea55710eb1e3dd2664f11746c169acd19e3bb619266bac255da419/68747470733a2f2f706f7365722e707567782e6f72672f6d6178696d2d6f6c65696e696b2f626c6164652d64617461626173652f762f737461626c65)](https://packagist.org/packages/maxim-oleinik/blade-database)

Универсальный адаптер к любому уже реализованному коннекту к БД.

Install
-------

[](#install)

1. Add to `composer`

    ```
        composer require maxim-oleinik/blade-database

    ```
2. Implement `\Blade\Database\DbConnectionInterface`
    Реализовать "мост" между своим коннектом к базе и этим Адаптером

    ```
        class MyDbConnection implements \Blade\Database\DbConnectionInterface
        {
            ->execute($sql, $bindings = []): int;
            ->each($sql, $bindings = []): Generator;
            ->escape($value): string
            ->beginTransaction();
            ->commit();
            ->rollBack();
        }

    ```

    Или использовать готовый:

    ```
        // PDO
        $dsn = sprintf('mysql:host=%s;port=%d;dbname=%s', $host, $port, $dbName);
        $connection = new \Blade\Database\Connection\PdoConnection($dsn, $user, $pass, [
            \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
            \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        ]);

    ```

    ```
        // PostgreSQL (pgsql)
        $dsn = sprintf('host=%s port=%d dbname=%s user=%s password=%s',
            $host, $port, $dbName, $user, $pass
        );
        $connection = new \Blade\Database\Connection\PostgresConnection($dsn, PGSQL_CONNECT_FORCE_NEW);

    ```

    ```
        // MySQL (mysqli)
        $connection = new \Blade\Database\Connection\MysqlConnection(
            $host, $user, $pass, $dbName, $port
        );

    ```

DbAdapter
---------

[](#dbadapter)

Класс представляет собой универсальную обертку над любым коннектом к БД.
И реализует набор вспомогательных методов для выборки из базы.

```
    $db = new DbAdapter(new MyDbConnection);

        ->execute($query, array $bindings = []): int          - Кол-во затронутых строк
        ->each($query, array $bindings = []): Generator       - Построчная выборка
        ->selectAll($query, array $bindings = []): array      - Выбрать всю выборку в один массив
        ->selectRow($query, array $bindings = []): array      - Выбрать одну строку
        ->selectColumn($query, array $bindings = []): array   - Выбрать значение 1 колонки в массив
        ->selectValue($query, array $bindings = []): string   - Выбрать единственное значение
        ->selectKeyValue($query, array $bindings = []): array - Выбрать значения 2ух колонок в ассоциативный массив col1 => $col2

        ->chunk($pageSize, SqlBuilder $sql, callable $handler) - Разбить выборку на части и вызвать $handler(array $rows) для каждой

        ->beginTransaction();
        ->commit();
        ->rollBack();
        ->transaction(callable $func)

        ->getConnection(): \Blade\Database\DbConnectionInterface

```

SqlBuilder
----------

[](#sqlbuilder)

### Настройка

[](#настройка)

```
    \Blade\Database\Sql\SqlBuilder::setEscapeMethod(function($value) {
        return pg_escape_string($value);
    });

    // или
    \Blade\Database\Sql\SqlBuilder::setEscapeMethod([$connection, 'escape']);

```

### Select

[](#select)

Автоматическое экранирование значений производится в where-условиях

```
    $sql = SqlBuilder::make('comment label')
        ->select("id, code, sum(code) as codes")
        ->addSelect("name")
        ->from("my_table", $alias = 't')
        ->setFromAlias('t')

        ->addJoin("LEFT JOIN authors AS a ON (a.id=t.author_id)")

        ->andWhere("t.id = %d", 123)
        ->andWhereEquals("t.id", 123)    // t.id='123'
        ->andWhereNotEquals("t.id", 123) // t.id'123'
        ->andWhereEquals("t.id", null)   // t.id IS NULL
        ->andWhere("a.name > '%s'", 'some text') // sprintf escaped values
        ->andWhereIn("t.code", [1,2,3])
        ->andWhereNotIn("t.code", [4,5])

        ->orderBy("id ASC, code")
        ->addOrder("name DESC")

        ->groupBy("t.code")
        ->having("sum(code) > 10")

        ->limit(10, $offset = 20);
    echo $sql;

```

**Подстановка Алиасов в колонки**

```
    $sql->setFromAlias('t')
        ->andWhere($sql->col('id') . '=1')  // "t.id=1"
        ->select($sql->col(['id', 'name'])) // "t.id, t.name"

```

**Join**

```
    // Raw SQL join
    $sql = SqlBuilder::make()
        ->addJoin("LEFT JOIN authors AS a ON (a.id=t.author_id)")
        // !!! при использовании join() - обязательно явно указывать select()
        ->select('t.*, a.id')
        ->andWhere("a.name > '%s'", 'some text');

```

```
    // Объединение 2ух запросов в Join
    $sqlAuthors = SqlBuilder::make()->from('authors', 'a')
        ->andWhere("a.name > '%s'", 'some text');

    $sql = SqlBuilder::make()->from("my_table", 't')
        ->innerJoin($sqlAuthors, 'ON (a.id=t.author_id)')
        ->leftJoin($sqlAuthors, 'USING author_id')
        ->rightJoin($sqlAuthors)
        // Универсальный метод
        ->join('FULL OUTER JOIN', $sqlAuthors, 'ON (...)')
        // !!! при использовании join() - обязательно явно указывать select()
        ->select('t.*')

```

**Подстановка count()**

```
    SqlBuilder::make()
        ->from("my_table")
        ->count($fields = '*');

    // SELECT count(*) FROM my_table

```

**exists() = SELECT 1**

```
    SqlBuilder::make('comment label')
        ->from("my_table")
        ->andWhere('...')
        ->exists(); // 1, если записи существуют

    // SELECT 1 FROM my_table WHERE ... LIMIT 1

```

**SELECT FROM (SELECT ...)**

```
    $subSql = SqlBuilder::make()
        ->from("some_tabe")
        ->andWhere('...')

    SqlBuilder::make()
        ->select('t.id')
        ->from($subSql, 't')

    // SELECT t.id FROM (SELECT * FROM some_tabe WHERE ...) AS t

```

### Insert

[](#insert)

```
    SqlBuilder::make()
        ->insert("my_table")
        ->values([
            'code' => 5,
            'name' => 'some text',
        ])
        ->returning('id, code');

    // INSERT INTO my_table (code, name) VALUES (5, 'some text') RETURNING id, code

```

**Вставка нескольких строк**

```
    SqlBuilder::make()
        ->insert("my_table")
        ->batchMode()
        ->values([
            [
                'code' => 5,
                'name' => 'some text',
            ],
            [
                'code' => 6,
                'name' => 'some text',
            ],
        ]);

    // INSERT INTO my_table (code, name) VALUES (5, 'some text'), (6, 'some text')

```

### Update

[](#update)

```
    SqlBuilder::make()
        ->update("my_table")
        ->andWhere("id = %d", 123)
        ->values([
            'code' => 5,
            'name' => 'some text',
        ]);

    // UPDATE my_table SET code=5, name='some text' WHERE id = 123

```

### Delete

[](#delete)

```
    SqlBuilder::make()
        ->delete("my_table")
        ->andWhere("id = %d", 123);

    // DELETE FROM my_table WHERE id = 123

```

###  Health Score

27

—

LowBetter than 49% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity17

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~77 days

Recently: every ~95 days

Total

6

Last Release

2477d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/df55f28e06f2a06012eaea10010c8b14fda8ce1fa04e66a548def287d925a798?d=identicon)[maxim.oleinik](/maintainers/maxim.oleinik)

---

Top Contributors

[![maxim-oleinik](https://avatars.githubusercontent.com/u/75860?v=4)](https://github.com/maxim-oleinik "maxim-oleinik (64 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/maxim-oleinik-blade-database/health.svg)

```
[![Health](https://phpackages.com/badges/maxim-oleinik-blade-database/health.svg)](https://phpackages.com/packages/maxim-oleinik-blade-database)
```

###  Alternatives

[doctrine/orm

Object-Relational-Mapper for PHP

10.2k285.3M6.2k](/packages/doctrine-orm)[jdorn/sql-formatter

a PHP SQL highlighting library

3.9k115.1M102](/packages/jdorn-sql-formatter)[illuminate/database

The Illuminate Database package.

2.8k52.4M9.4k](/packages/illuminate-database)[mongodb/mongodb

MongoDB driver library

1.6k64.0M546](/packages/mongodb-mongodb)[ramsey/uuid-doctrine

Use ramsey/uuid as a Doctrine field type.

90340.3M211](/packages/ramsey-uuid-doctrine)[reliese/laravel

Reliese Components for Laravel Framework code generation.

1.7k3.4M16](/packages/reliese-laravel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
