Cycle ORM requires at least one connection to the database in order to operate. The DBAL functionality is
provided by the package spiral/database.
Make sure to install all required dependencies listed in the previous section.
In order to start, we have to initialize the DatabaseManager service used to automatically create and manage a set of application databases.
The list of available connections and databases can be provided in the initial configuration.
use Spiral\Database;
$dbConfig = new Database\Config\DatabaseConfig([
'default' => 'default',
'databases' => [
'default' => [
'connection' => 'sqlite'
]
],
'connections' => [
'sqlite' => [
'driver' => Database\Driver\SQLite\SQLiteDriver::class,
'options' => [
'connection' => 'sqlite:database.db',
'username' => '',
'password' => '',
]
]
]
]);
$dbal = new Database\DatabaseManager($dbConfig);
You can instantiate DBAL with an empty connection list and configure it in runtime if needed.
The Spiral/Database module provides support to manage multiple databases in one application, use read/write connections and logically separate multiple databases within one connection using prefixes.
To register a new database simply add it into databases section:
'default' => [
'connection' => 'sqlite'
]
To use a database-specific prefix use the prefix option (all the queries will be affected):
'default' => [
'connection' => 'sqlite',
'prefix' => 'secondary_'
]
To use read/write connections use sections connection and readConnection accordingly:
'default' => [
'connection' => 'mysql',
'readConnection' => 'mysqlSlave',
'prefix' => 'secondary_'
]
Each database instance must have an associated connection object. Connections used to provide low-level functionality and wrap different database drivers. To register a new connection you have to specify the driver class and its connection options:
For SQLite:
'sqlite' => [
'driver' => \Cycle\Database\Driver\SQLite\SQLiteDriver::class,
'options' => [
'connection' => 'sqlite:database.db',
'username' => '',
'password' => '',
]
]
Use
sqlite::memory:to keep SQLite in memory.
For MySQL and MariaDB:
'mysql' => [
'driver' => \Cycle\Database\Driver\MySQL\MySQLDriver::class,
'options' => [
'connection' => 'mysql:host=127.0.0.1;dbname=database',
'username' => 'mysql',
'password' => 'mysql',
]
],
For PostgresSQL:
'postgres' => [
'driver' => \Cycle\Database\Driver\Postgres\PostgresDriver::class,
'options' => [
'connection' => 'pgsql:host=127.0.0.1;dbname=database',
'username' => 'postgres',
'password' => 'postgres',
],
],
For SQLServer:
'sqlServer' => [
'driver' => \Cycle\Database\Driver\SQLServer\SQLServerDriver::class,
'options' => [
'connection' => 'sqlsrv:Server=OWNER;Database=DATABASE',
'username' => 'sqlServer',
'password' => 'sqlServer',
],
],
Make sure to install the proper PDO extensions!
There are multiple connection options you can use to customize the behavior.
| Options | Value | Description |
|---|---|---|
| timezone | string | Default driver timezone (all DateTimeInterface query parameters will be converted into it). Defaults to UTC. |
| reconnect | bool | Allow the driver to automatically reconnect. Defaults to false. |
| profiling | bool | Enable SQL profiling (logging). Defaults to false. |
To access the database using the DatabaseManager, use the method database:
print_r($dbal->database('default'));
The database will be automatically connected on the first SQL request.
DBAL will use the database specified in the
defaultconfig option if the name isnull.
Direct SQL queries are possible from this moment:
$dbal->database('default')->table('users')->select()->fetchAll();
Each of the database drivers implements the Psr\Log\LoggerAwareInterface. You can enable SQL logging by assigning a logger:
$driver = $dbal->database('default')->getDriver();
$driver->setLogger($myLogger);
In addition to config driven setup you are able to configure your database connections in runtime:
use Cycle\Database;
$dbal->addDatabase(new Database\Database(
'name',
'prefix_',
new Database\Driver\SQLite\SQLiteDriver([
'connection' => 'sqlite::memory:',
'username' => 'username',
'password' => 'password',
'options' => []
])
));
This approach can be useful to test your application using database mocks. Attention, DBAL would not allow you to overwrite already exists database, you must explicitly configure empty
DatabaseManager.