PHPackages                             phore/unidb - 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. phore/unidb

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

phore/unidb
===========

Universal DB Access

0232PHP

Since Jul 7Pushed 3y ago1 watchersCompare

[ Source](https://github.com/phore/phore-unidb)[ Packagist](https://packagist.org/packages/phore/unidb)[ RSS](/packages/phore-unidb/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

phore-unidb
===========

[](#phore-unidb)

Unified DB Access

Features:

- Easy to use thanks to [PHP8 Named Arguments](https://www.php.net/manual/en/functions.arguments.php) features
-

Basic example
-------------

[](#basic-example)

```
// Setup table structure and driver
$udb = new UniDb(
    new SqliteDriver(new \PDO("sqlite::memory:")),
    new Schema(
        [
            "User" => [
                "indexes" => ["user_name"]
            ]
        ]
    )
);

// Create the schema (if it does not already exist)
echo $udb->createSchema();

// Select the 'User' Table
$userTbl = $udb->with("User");

// Insert two entities
$userTbl->insert(["user_id"=>"user1", "user_name" => "Bob"]);
$userTbl->insert(["user_id"=>"user2", "user_name" => "Alice"]);

// Query all datasets with user_name='Bob' OR user_name='Alice'
foreach ($userTbl->query(stmt: new OrStmt(["user_id", "=", "Bob"], ["user_id", "=", "Alice"])) as $data) {
    print_R ($data);
}
```

Installation
------------

[](#installation)

```
composer require phore/unidb
```

DriverClassFeaturesSqliteDriver`SqliteDriver`Schema createDefining the schema
-------------------

[](#defining-the-schema)

UniDb requires basic information about the schema to run queries against.

Querying data
-------------

[](#querying-data)

```
public  UniDb::query(
    $stmt = null,
    string $table = null,
    int $page = null,
    int $limit = null,
    string $orderBy = null,
    string $orderType="ASC",
    bool $cast = false
) : \Generator
```

Named ArgumentDescription`stmt`The Statement: either class `AndStmt` or `OrStmt`. If null, all data will be queried`table`Override the default table setting defined using `UniDb::with()``cast`If `true` it will cast the structure into the Object defined***Accessing the data using generators***

The easies way to access the data is to use generators:

```
foreach ($odb->query(table: "User") as $user) {
    print_r ($user); // Will output
}
```

***Accessing full Result Set / Limit results / Page offsets***

```
$odb->query(table: "User", limit: 10, page: 1);
print_r ($odb->result->getResult());
```

[See output / full example](doc/doc_result_set.md)

***Using Object Casting / Entities***

UniDb can work with Objects and therefor uses [phore/hydrator](https://github.com/phore/phore-hydrator) to cast the result set into objects. Activate this feature by specifying `cast: SomeClass::class` in Argument list.

> To use casting functionality you have to add package `phore/hydrator` to your composer.json requirements

```
foreach ($odb->query(table: "User", cast: User::class) as $obj) {
    print_r ($obj); // Instance of User class
}
```

[See details manual page for Object casting](doc/doc_object_casting.md)

***Quering all data of a table***

```
$odb->query(table: "User")

```

***Sorting the data***

Statements
----------

[](#statements)

To be compatible to as well SQL and NoSql Databases, UniDb uses Statements to query data. By default statements will be chained by AND statements.

***AND Statement***

```
new AndStmt(["name", "=", "Bob"], ["user_name", "=", "bob1"]);
// => SELECT ... WHERE name='Bob' AND name='Alice'
```

***OR Statement***

```
new OrStmt(["name", "=", "Bob"], ["name", "=", "Alice"]);
// => SELECT ... WHERE name='Bob' OR name='Alice'
```

***Nested Statements***

```
new AndStmt(["name", "=", "Bob"], new OrStmt(["name", "=", "Bob"], ["name", "=", "Alice"]));
// => SELECT ... WHERE name='Bob' AND ( name='Bob' OR name='Alice' )
```

***Operators***

OperatorExpected ValueDescription`=`stringint``stringint`>`stringint`
