yawaweb / yii2-oci8
Yii2 extension which uses well written pdo-via-oci8 package for standard PHP Oracle functions (OCI8)
1.0
2024-04-22 13:18 UTC
Requires
- php: ^8.0
- yajra/laravel-pdo-via-oci8: ^3
- yiisoft/yii2: *
README
Yii2 OCI8 extension which uses well written yajra/pdo-via-oci8 with optional full table schema caching. Supported PHP8.
Requirements
- Yii ^2.x;
- yajra/pdo-via-oci8: ^3;
- PHP ^8.0.
Installation
composer require yawaweb/yii2-oci8
Yii2 configuration example for an Oracle database
Yii2 configuration:
$config = [ ... 'components' => [ ... 'db' => require(__DIR__ . '/db.php'), ... ] ];
Database configuration in db.php
:
return [ 'class' => 'yawaweb\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'; -- ATTENSION: A 'NLS_COMP=LINGUISTIC' option is slow down queries; -- execute immediate 'alter session set NLS_COMP=LINGUISTIC'; 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
:
... //Disabling Yii2 schema cache 'enableSchemaCache' => false //Defining a cache schema component 'cachedSchema' => [ 'class' => 'yawaweb\yii2oci8\CachedSchema', // Optional, dafault is 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) { //Cache everything 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 \yawaweb\yii2oci8\CachedSchema */ $schema = $event->sender->getSchema(); if (!$schema->isCached) //Rebuild schema cache $schema->buildSchemaCache(); },