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 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
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 = 'oceanbase_user' . time(); $user->email = 'user' . time() . '******@oceanbase.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/index查看
runtime/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":"oceanbase_user1654857016","email":"******@oceanbase.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":"oceanbase_user1749628918","email":"******@oceanbase.com","age":31,"created_at":1749628919}} }