yawaweb/yii2-oci8

使用pdo-via-oci8软件包的Yii2扩展,该软件包编写得很好,用于标准PHP Oracle函数(OCI8)

1.0 2024-04-22 13:18 UTC

This package is auto-updated.

Last update: 2024-09-23 15:00:06 UTC


README

Yii2 OCI8扩展,使用编写良好的 yajra/pdo-via-oci8,可选完整表模式缓存。支持PHP8。

要求

  • Yii ^2.x;
  • yajra/pdo-via-oci8: ^3;
  • PHP ^8.0.

安装

composer require yawaweb/yii2-oci8

Oracle数据库的Yii2配置示例

Yii2配置

$config = [
    ...
    'components' => [
        ...
        'db' => require(__DIR__ . '/db.php'),
        ...
    ]
];

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();
    }
];

示例

自由使用Yii2 ActiveRecord方法

$cars = Car::find()->where(['YEAR' => '1939'])->indexBy('ID')->all();

获取原始数据库处理程序并与它一起工作

$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

缓存功能

要在模式中的所有表中启用缓存,请在数据库连接配置 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';
        }
    ],
    ...

将表模式保存到默认的Yii2缓存组件。在连接打开后构建模式缓存

    '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();
    },