Skip to content

Database

NaN provides its own database abstraction based around PHP’s PDO, under the NaN\Database namespace. For databases not supported by PDO you’ll have to write your own PDO-based driver.

Terminal window
composer require aimfornan/nan-db

The DSN takes either an array or a string. The configuration must match the parameters of the \PDO::connect method.

use NaN\Database\Connection;
/** @var \Nan\Database\Interfaces\ConnectionInterface $mysql_connection */
$mysql_connection = Connection::connect([
'dsn' => [
'prefix' => 'mysql'
'host' => 'localhost',
'port' => 3306,
'charset' => 'utf8mb4',
],
'username' => 'username',
'password' => 'password',
'options' => [ // PDO options!
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_SILENT,
],
]);

Each connection supports executing raw queries.

/** @var \Nan\Database\Interfaces\ConnectionInterface $connection */
$connection->raw(/* raw query string */);

The raw method of the connection accepts an optional, second parameter. The second parameter is used to bind values for prepared statements. An empty array will not induce a prepared statement.

/** @var \Nan\Database\Connection $sql_connection */
$sql_connection->raw('SELECT FROM `users` WHERE `id` = ?', [100]);

Basic SQL support falls under the NaN\Database\Sql namespace.

use NaN\Database\Sql\Query\Builders\SqlQueryBuilder;
/** @var \NaN\Database\Query\Builders\Interfaces\QueryBuilderInterface $query_builder */
$query_builder = new SqlQueryBuilder();

Query builders provide a higher-level API to constructing queries. Query builders support typical CRUD operations via the patch, pull, purge, and push methods.

CRUD operation NaN operation SQL equivalent
CREATE PUSH INSERT
RETRIEVE PULL SELECT
UPDATE PATCH UPDATE
DELETE PURGE DELETE

How these operate exactly are left up to the implementation.

/**
* @var \NaN\Database\Interfaces\ConnectionInterface $connection
* @var \NaN\Database\Query\Builders\Interfaces\QueryBuilderInterface $query_builder
* @var \NaN\Database\Query\Statements\Interfaces\StatementInterface $pull_statement
*/
$pull_statement = $query_builder->pull();
$pull_statement->exec($connection);

Bindings are handled automatically. As with raw statements, if the bindings are empty, then a regular query will be used instead of a prepared statement.

In both exec and raw cases, a \PDOStatement object is returned if the query succeeds, and false if it fails. Depending on the PDO configuration, it may also throw an exception.

/**
* @var \NaN\Database\Interfaces\ConnectionInterface $connection
* @var \NaN\Database\Query\Statements\Interfaces\StatementInterface $query
* @var \PDOStatement|false $pdo_statement
*/
$pdo_statement = $query->exec($connection);
use \NaN\Database\Sql\Query\Statements\Clauses\WhereClause;
/**
* @var \NaN\Database\Query\Builders\Interfaces\QueryBuilderInterface $query_builder
* @var \NaN\Database\Sql\Query\Statements\UpdateStatement $stmt
*/
$stmt = $query_builder
->patch('users')
->with([
'display_name' => 'NaN',
])
->where(function (WhereClause $where) {
$where->is('id', '=', 1);
})
;
/**
* @var \NaN\Database\Query\Builders\Interfaces\QueryBuilderInterface $query_builder
* @var \NaN\Database\Sql\Query\Statements\SelectStatement $stmt
*/
$stmt = $query_builder
->pull()
->from('users')
->last('id')
;
use \NaN\Database\Sql\Query\Statements\Clauses\WhereClause;
/**
* @var \NaN\Database\Query\Builders\Interfaces\QueryBuilderInterface $query_builder
* @var \NaN\Database\Sql\Query\Statements\DeleteStatement $stmt
*/
$stmt = $query_builder
->purge('users')
->where(function (WhereClause $where) {
$where->is('id', '=', 1);
})
;
/**
* @var \NaN\Database\Query\Builders\Interfaces\QueryBuilderInterface $query_builder
* @var \NaN\Database\Sql\Query\Statements\InsertStatement $stmt
*/
$stmt = $query_builder
->push([
'foo' => 'bar',
])
->into('users')
;