概要
CakePHPは、関連データマッピング、フロントエンドコントローラー、MVCなどの設計パターンを採用したPHPの高速開発フレームワークです。 本記事では、CakePHPにOceanBaseデータベースを接続し、基本的なCRUD(追加・削除・変更・検索)操作を実装する方法について説明します。
機能の適用範囲
CakePHPはOceanBaseデータベースのMySQLモードに適用されます。
前提条件
CakePHPを使用する前に、次のことを確認してください:
- OceanBaseデータベースのデプロイが完了し、MySQLモードのユーザーテナントが作成されていること。テナントの作成方法の詳細については、テナントの作成を参照してください。
手順
ステップ1:データベース接続文字列を取得する
OceanBaseデータベースのデプロイ担当者から接続文字列を取得します。例:
obclient -h$host -P$port -u$user_name -p$password -D$database_name
パラメータ説明:
$host:接続IPアドレス。ODP接続の場合はODPアドレスを使用し、直接接続の場合はOBServer IPを使用します。$port:接続ポート。ODPのデフォルトは2883、直接接続のデフォルトは2881です。$database_name:データベース名。注意
テナントに接続するユーザーには、データベースに対する
CREATE、INSERT、DROP、およびSELECT権限が付与されていなければなりません。ユーザー権限の詳細については、MySQLモードの権限分類を参照してください。$user_name:接続アカウント。ODP形式:ユーザー@テナント#クラスタまたはクラスタ:テナント:ユーザー。直接接続形式:ユーザー@テナント。$password:アカウントのパスワード。
接続文字列の詳細については、OBClientを使用してOceanBaseテナントに接続するを参照してください。
例:
obclient -hxxx.xxx.xxx.xxx -P2881 -utest_user001@mysql001 -p****** -Dtest
ステップ2:CakePHP環境をインストールする
- PHP 8.3および関連拡張機能をインストールします:
apt update
apt install -y software-properties-common
add-apt-repository ppa:ondrej/php
apt install -y unzip git php8.3 php8.3-mysql php8.3-mbstring php8.3-intl php8.3-dom php8.3-simplexml php8.3-sqlite3 php8.3-pdo
- Composerをインストールします:
curl -sS https://getcomposer.org/installer | php
# Composerが正常に動作するか確認する
php composer.phar --version
ステップ3:CakePHPプロジェクトを作成する:
# 新しいCakePHPプロジェクトを作成する
php composer.phar create-project --prefer-dist cakephp/app:~5.0 my_cakephp_app
# プロジェクトディレクトリに移動する
cd my_cakephp_app
ステップ4:データベース接続を設定する
config/app_local.php ファイルを修正し、データベース接続パラメータを設定します:
'Datasources' => [
'default' => [
'host' => '$host',
/*
* CakePHP will use the default DB port based on the driver selected
* MySQL on MAMP uses port 8889, MAMP user will want to uncomment
* the following line and set the port accordingly
*/
'port' => '$port',
'username' => '$user_name',
'password' => '$password',
'database' => '$database_name',
/*
* If not using the default 'public' schema with the PostgreSQL driver
* set it here.
*/
//'schema' => 'myapp',
/*
* You can use a DSN string to set the entire configuration
*/
'url' => env('DATABASE_URL', null),
]
データベースのアドレス、ポート番号、データベース名、ユーザー名、パスワードについては、ステップ1を参照してください。
ステップ5:モデルとテーブル構造を作成する
- OceanBaseでユーザーテーブルを作成します:
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,
first_name varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
last_name varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
age int(11) DEFAULT NULL,
status varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT 'active',
PRIMARY KEY (id),
UNIQUE KEY idx_email (email),
KEY idx_username (username)
);
- Userモデルをsrc/Model/Table/UserTable.phpに作成します:
bin/cake bake model User
ステップ6:データベース操作コードを記述する
コントローラーを作成します:src/Controller/UserController.php:
<?php
declare(strict_types=1);
namespace App\Controller;
use Cake\Log\Log;
class UserController extends AppController
{
public function index()
{
$this->autoRender = false;
$this->response = $this->response->withType('application/json');
try {
Log::info('Processing user data...');
$userTable = $this->fetchTable('User');
Log::info('User table created successfully');
// 1. Insert
$user = $userTable->newEmptyEntity();
$userData = [
'username' => 'example_user',
'email' => 'user@example.com',
'age' => 35
];
$user = $userTable->patchEntity($user, $userData);
if ($userTable->save($user)) {
Log::info('Insert succeeded, ID: ' . $user->id);
}
// 2. Read
$foundUser = $userTable->get($user->id);
$userData = $foundUser->toArray();
$userData['created_at'] = 1654857016; // mock timestamp
Log::info('Query result: ' . json_encode($userData, JSON_UNESCAPED_UNICODE));
// 3. Update
$foundUser->age = 36;
if ($userTable->save($foundUser)) {
Log::info('Update succeeded');
}
// 4. Delete
if ($userTable->delete($foundUser)) {
Log::info('Delete succeeded');
}
echo json_encode(['success' => true, 'message' => 'CRUD completed']);
} catch (\Exception $e) {
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
}
}
ステップ6:プログラムを実行し、結果を検証する
- CakePHPの組み込み開発サーバーを起動します:
bin/cake server -H 0.0.0.0 -p 8765 &
- curlを使用してテストします:
curl -s http://localhost:8765/user
# {"success":true,"message":"CRUD completed"}
- logs/debug.logファイルを確認すると、以下に似たログ出力が見られるはずです:
2026-03-02 09:38:11 info: Processing user data...
2026-03-02 09:38:11 info: User table created successfully
2026-03-02 09:38:11 info: Insert succeeded, ID: 2
2026-03-02 09:38:11 info: Query result: {"id":2,"username":"example_user","email":"user@example.com","first_name":null,"last_name":null,"age":35,"status":"active","created_at":1654857016}
2026-03-02 09:38:11 info: Update succeeded
2026-03-02 09:38:11 info: Delete succeeded
注意点
Q1:SHOW INDEXESの出力の違い OceanBaseでは、条件式はインデックスメタデータ内で仮想列名(例:SYS_NC19$)として表現されますが、MySQLでは対応する箇所がNULLになります。もしCakePHPのスキーマ解析が「インデックス内のColumn_nameはテーブル上の実際の列名である必要がある」という条件に依存している場合、SYS_NC19$を認識できないか誤って処理したことで解析エラーが発生する可能性があります。
Q2:文字セットの違い CakePHPはデフォルトでutf8_general_ci文字セットを使用しますが、OceanBaseはデフォルトでutf8mb4_general_ciを使用します。
Q3:外部キーの命名規則 OceanBaseとMySQLの外部キーの命名規則が一致しないため、CakePHPによる外部キー制約の認識に影響を与える可能性があります。
Q4:ソートされていないクエリ結果の順序 CakePHPでソートを指定しないクエリは、MySQLでは昇順で返されますが、OceanBaseでは降順で返される可能性があります。