Yii 2.0 は、高性能な PHP フレームワークであり、強力な ORM 機能を提供します。Yii 2.0 の ActiveRecord クラスは、データベース操作に対して洗練されたソリューションを提供し、OceanBase データベースとの互換性を含む、さまざまなデータベースシステムをサポートしています。
Yii 2.0 ORM の主な特徴:
- モデル定義、CRUD 操作、関連関係を含む完全な ORM サポート
- MySQL、PostgreSQL、SQLite など、さまざまなデータベースシステムをサポート
- クエリビルダ、トランザクション処理、データバリデーションなどの高度な機能を提供
- 高性能なキャッシュメカニズムと遅延読み込み
- Yii 2.0 フレームワークとの深い統合
本ドキュメントでは、Yii 2.0 ORM を使用して OceanBase データベースに接続し、テーブルの作成、データの挿入、更新、クエリなどの基本的なデータベース操作を実装する方法について説明します。
前提条件
- PHP 7.4以降のバージョンがインストール済みであること。
- Composerパッケージ管理ツールがインストールされていること。
- OceanBaseデータベースをインストール済みで、MySQLテナントが作成されていること。
- OceanBaseデータベースの接続文字列を取得していること。
操作手順
- OceanBaseデータベースの接続文字列を取得します。
- Yii 2.0プロジェクトを作成し、依存関係をインストールします。
- データベース接続を設定します。
- モデルとデータベースマイグレーションを作成します。
- データベース操作コードを記述します。
- プログラムを実行し、結果を検証します。
ステップ1:OceanBaseデータベースの接続文字列を取得する
OceanBaseデータベースのデプロイ担当者または管理者から、該当するデータベース接続文字列を取得します。
obclient -h$host -P$port -u$user_name -p$password -D$database_name
パラメータ説明:
$host:OceanBaseデータベースへの接続IPアドレス。OceanBaseデータベースプロキシ(OceanBase Database Proxy、ODP)接続方式ではODPアドレスを使用し、直接接続方式ではOBServerノードのIPアドレスを使用します。$port:OceanBaseデータベースの接続ポート。ODP接続方式のデフォルトポートは2883で、ODPデプロイ時にカスタマイズ可能です。直接接続方式のデフォルトポートは2881で、OceanBaseデータベースのデプロイ時にカスタマイズ可能です。$database_name:アクセス対象のデータベース名。注意
テナントに接続するユーザーは、データベースに対する
CREATE、INSERT、UPDATEおよびSELECT権限が付与されていなければなりません。その他のユーザー権限の詳細については、MySQLモードの権限分類を参照してください。$user_name:テナントの接続アカウント。ODP接続の一般的な形式:ユーザー名@テナント名#クラスタ名またはクラスタ名:テナント名:ユーザー名。直接接続方式の形式:ユーザー名@テナント名。$password:アカウントのパスワード。
その他の接続文字列の情報については、OBClientを使用したOceanBaseテナントへの接続を参照してください。
例:
obclient -hxxx.xxx.xxx.xxx -P2881 -utest_user001@mysql001 -p****** -Dtest
ステップ2:Yii 2.0プロジェクトを作成し、依存関係をインストールする
Composerを使用して新しいYii 2.0プロジェクトを作成します:
# Yii 2.0基本アプリケーションテンプレートをインストール composer create-project --prefer-dist yiisoft/yii2-app-basic yii2-oceanbase cd yii2-oceanbaseデータベースの依存関係をインストールします:
composer require --prefer-dist yiisoft/yii2-debug composer require --prefer-dist yiisoft/yii2-giiインストールを確認します:
php yii help
インストールが成功した場合、Yiiのバージョン情報が表示されます。
ステップ3:データベース接続の設定
config/db.php ファイルを編集し、OceanBaseデータベース接続を設定します:
```php
<?php
return [
class' => 'yii\db\Connection',
dsn' => 'mysql:host=your_oceanbase_host;port=2881;dbname=your_database',
username' => 'your_username',
password' => 'your_password',
charset' => 'utf8mb4',
tablePrefix' => 'tbl_',
enableSchemaCache' => true,
schemaCacheDuration' => 3600,
schemaCache' => 'cache',
enableQueryCache' => true,
queryCacheDuration' => 3600,
attributes' => [
PDO::ATTR_TIMEOUT => 30, // タイムアウト時間を30秒に設定
],
];
```
ステップ4:モデルとテーブル構造の作成
Userモデル
models/User.phpを作成します:<?php namespace app\models; use Yii; use yii\db\ActiveRecord; use yii\db\Connection; use yii\db\Schema; class User extends ActiveRecord { public static function tableName() { return '{{%user}}'; } public function rules() { return [ [['username', 'email'], 'required'], ['email', 'email'], ['age', 'integer', 'min' => 0], ['username', 'string', 'max' => 100], ['email', 'string', 'max' => 100], [['created_at'], 'safe'], ]; } public function beforeSave($insert) { if (parent::beforeSave($insert)) { if ($this->isNewRecord) { $this->created_at = time(); } return true; } return false; }ユーザーテーブルを作成します:
CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, email varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, age int(11) DEFAULT NULL, created_at int(11) NOT NULL, PRIMARY KEY (id), UNIQUE KEY idx-email (email), KEY idx-username (username) );
ステップ5:データベース操作コードを記述する
- コントローラー
controllers/UserController.phpを作成します:
<?php
namespace app\controllers;
use Yii;
use yii\web\Controller;
use yii\web\Response;
use app\models\User;
class UserController extends Controller
{
public function actionIndex()
{
// トランザクションの開始
$transaction = Yii::$app->db->beginTransaction();
try {
// 1. データの挿入
$user = new User();
$user->username = 'example_user' . time();
$user->email = 'user' . time() . '@example.com';
$user->age = rand(20, 60);
if (!$user->save()) {
throw new \Exception('ユーザーの保存に失敗しました: ' . json_encode($user->getErrors(), JSON_UNESCAPED_UNICODE));
}
Yii::info('データの挿入に成功しました, ID: ' . $user->id);
// 2. データのクエリ
$foundUser = User::findOne($user->id);
if (!$foundUser) {
throw new \Exception('ユーザーのクエリに失敗しました: ユーザーが存在しません');
}
Yii::info('クエリデータ: ' . json_encode($foundUser->attributes, JSON_UNESCAPED_UNICODE));
// 3. データの更新
$foundUser->age += 1;
if (!$foundUser->save()) {
throw new \Exception('ユーザーの更新に失敗しました: ' . json_encode($foundUser->getErrors(), JSON_UNESCAPED_UNICODE));
}
Yii::info('データの更新に成功しました');
// 4. バッチ挿入の例
$rows = [];
$columns = ['username', 'email', 'age', 'created_at'];
$time = time();
for ($i = 0; $i < 5; $i++) {
$rows[] = [
user' . $i . '_' . $time,
user' . $i . '_' . $time . '@example.com',
rand(20, 60),
$time
];
}
Yii::$app->db->createCommand()->batchInsert(
User::tableName(),
$columns,
$rows
)->execute();
Yii::info('5件のデータをバッチ挿入しました');
// 5. すべてのデータのクエリ
$count = User::find()->count();
Yii::info("現在のユーザー数: $count");
// 6. ページネーションクエリ
$pageSize = 3;
$users = User::find()
->orderBy(['id' => SORT_DESC])
->limit($pageSize)
->all();
Yii::info('ページネーションクエリ結果: ' . count($users) . '件');
// 7. データの削除
if ($foundUser->delete() === false) {
throw new \Exception('ユーザーの削除に失敗しました');
}
Yii::info('データの削除に成功しました');
$transaction->commit();
return $this->asJson([
success' => true,
message' => '操作に成功しました',
data' => [
userCount' => $count,
sampleUser' => $foundUser->attributes
]
]);
} catch (\Exception $e) {
$transaction->rollBack();
Yii::error($e->getMessage());
return $this->asJson([
success' => false,
message' => '操作に失敗しました: ' . $e->getMessage(),
]);
}
}
}
ステップ6:プログラムを実行し、結果を検証する
Yiiの組み込み開発サーバーを起動します:
php yii serveブラウザで
curl http://localhost:8080/index.php?r=user/indexにアクセスするか、curlでテストします:curl http://localhost:8080/index.php?r=user/indexruntime/logs/app.logファイルを確認すると、以下のようなログ出力が見られるはずです:2025-06-10 11:30:15 [info][application] ユーザーデータの処理を開始します... 2025-06-10 11:30:16 [info][application] ユーザーテーブル user の作成に成功しました 2025-06-10 11:30:16 [info][application] データの挿入に成功しました, ID: 1 2025-06-10 11:30:16 [info][application] クエリデータ: {"id":1,"username":"example_user","email":"user@example.com","age":35,"created_at":1654857016} 2025-06-10 11:30:16 [info][application] データの更新に成功しました 2025-06-10 11:30:16 [info][application] 5件のデータをバッチ挿入しました 2025-06-10 11:30:16 [info][application] 現在のユーザー数: 6 2025-06-10 11:30:16 [info][application] ページネーションクエリ結果: 3件 2025-06-10 11:30:16 [info][application] データの削除に成功しました応答結果の例:
{ success:true,"message":"操作に成功しました","data":{"userCount":6,"sampleUser":{"id":1,"username":"example_user1749628918","email":"user1749628919@example.com","age":31,"created_at":1749628919}} }