Yii2 OCI8 extension which uses yajra/pdo-via-oci8 library with optional full table schema caching. Supported PHP8.
Supported
- Yii 2.x;
- yajra/pdo-via-oci8 3.x;
- >= PHP 8.1
Installation
Add to your composer.json
file:
"require": {
"aliobeidat/yii2-oci8": "dev-master"
}
And then run composer update
.
Yii2 configuration example for an Oracle database
Yii2 configuration:
$config = [
...
'components' => [
...
'db' => require(__DIR__ . '/db.php'),
...
]
];
Database configuration in db.php
:
return [
'class' => 'aliobeidat\yii2oci8\Oci8Connection',
'dsn' => 'oci:dbname=//192.168.0.1:1521/db.local;charset=AL32UTF8;',
'username' => 'user',
'password' => 'pass',
'attributes' => [ PDO::ATTR_PERSISTENT => true ],
'enableSchemaCache' => true, //Oracle dictionaries is too slow :(, enable caching
'schemaCacheDuration' => 60 * 60, //1 hour
'on afterOpen' => function($event) {
/* A session configuration example */
$q = <<<SQL
begin
execute immediate 'alter session set NLS_SORT=BINARY_CI';
execute immediate 'alter session set NLS_TERRITORY=AMERICA';
end;
SQL;
$event->sender->createCommand($q)->execute();
}
];
Example
Feel free to use Yii2 ActiveRecord
methods:
$cars = Car::find()->where(['YEAR' => '1939'])->indexBy('ID')->all();
Getting a raw database handler and working with it:
$dbh = Yii::$app->db->getDbh();
$stmt = oci_parse($dbh, "select * from DEPARTMENTS where NAME = :name");
$name = 'NYPD';
oci_bind_by_name($stmt, ':name', $name);
oci_execute($stmt);
...
//fetching result
Caching features
To enable caching for all tables in a schema add lines below in a database connection configuration db.php
or main.php
:
...
//Disabling Yii2 schema caching
'enableSchemaCache' => false
//Defining a cache schema component
'cachedSchema' => [
'class' => 'aliobeidat\yii2oci8\CachedSchema',
// Optional, default is the current connection schema.
'cachingSchemas' => ['HR', 'SCOTT'],
// Optional. This callback must return `true` for a table name if it need to be cached.
'tableNameFilter' => function ($tableName, $schemaName) {
//Cache everythings but the EMP table from HR and SCOTT schemas
return $tableName != 'EMP';
}
],
...
Table schemas saves to the default Yii2 cache component. To build schema cache after a connection opens:
'on afterOpen' => function($event)
{
$event->sender->createCommand($q)->execute();
/* @var $schema \aliobeidat\yii2oci8\CachedSchema */
$schema = $event->sender->getSchema();
if (!$schema->isCached)
//Rebuild schema cache
$schema->buildSchemaCache();
},