Apricotでは、ORマッパーにIdiormを使用します。詳しい使い方やメソッドについてはIdiormのマニュアルを参照して下さい。
Idiorm の典型的な使用例を示します:
$user = ORM::for_table('user')->find_many();
これは、userテーブルから全件を検索する例です。このように、IdiormではORMクラスの静的メソッドの呼び出しを使ってコーディングします。これはApricotのシングルトンと同じ方法で、実際にORMクラスもシングルトンです。
以下はApricotが提供している初期のIdiormの設定ファイル( idiorm.setting.php
)です。
/your-project/config/setting
<?php /** * This file contains Idiorm settings. */ $now = date("Y-m-d H:i:s"); return [ 'database'=>'sqlite', 'caching' => true, 'logging' => true, 'connections' => [ 'sqlite' => [ 'connection_string' => 'sqlite:'.var_dir('db/apricot.sqlite'), 'db_file' => var_dir('db/apricot.sqlite'), ], 'mysql' => [ 'connection_string' => 'mysql:host=localhost;port=3306;dbname=apricotdb', 'username' => 'apricot', 'password' => 'password', 'driver_options' => [PDO::MYSQL_ATTR_INIT_COMMAND => 'set names utf8'], 'check_tables' => 'show tables like \'user\'', 'initial_statements'=> [ 'set names utf8', ], ], ], 'initial_data' => [ 'user'=> [ 'exec:sqlite' =>[ 'delete from sqlite_sequence where name=\'user\'', ], 'exec:mysql' =>[ 'alter table user auto_increment = 1;', ], 'rows' => [ [ 'account' =>'root', 'password' =>password_hash('', PASSWORD_DEFAULT), 'email' =>'root@sample.com', 'note' =>'Initial User', 'created_at' => $now, 'updated_at' => $now, ], ], ], ], ];
database
は任意の名前が指定できますが、connections
の中で使用する名前と一致している必要があります。connections
には、複数のデータベースの接続を含める事ができますが、実際に使用されるのは database
で指定されたものだけです。
各データベースの設定値には以下の項目が含まれます。
connection_string
は必須です。db_file
は SQLite のようなファイル共有型のデータベースの場合に必要で、username
と password
は MySQL のようなクライアント-サーバ型のデータベースの場合に必要になります。connection_string
と driver_options
についてはを PHPのPDO driver-specific documentation 参照して下さい。
接続設定及び接続文字列の詳細は以下を参照して下さい:
https://idiorm.readthedocs.io/en/latest/configuration.html#id1
check_tables
はオプションで、アプリケーションで使用するテーブルの存在を調べるSQLクエリ文を設定します。詳しくは次項のIdiormのセットアップを参照して下さい。
initial_statements
はオプションで、データベースとの接続直後に実行するSQL文を設定します。このSQL文は複数指定することができます。
テーブル毎に初期データが設定できます。各テーブルの設定値は以下の通りです。
exec
には初期データを挿入する前に実行されるSQL文を設定する事ができます。exec
には上例のように接尾語として :{データベース名}
を付加する事ができます。SQL文がデータベースの種類の依存する場合に使用して下さい。
初期データについては、次項のIdiormのセットアップも参照して下さい。
Idiormには以下のセットアップファイルが存在します。セットアップの動作をカスタマイズした場合は、このファイルを変更して下さい。
/your-project/config/setup/idiorm.setup.php
このセットアップファイルでは以下の事をおこないます:
Idiormの設定ファイル( idiorm.setting.php ) に従ってデータベースへの接続を行います。db_file
が設定されている場合は、それが設置されるディレクトリを自動作成します。そして、IdiormのORMオブジェクトを初期化し、設定に応じてキャッシングを開始します。ロギングが有効な場合は、Apricotのログイン設定に従ってINFOレベルのログを出力します。
新しくデータベースを作った時に、テーブルを自動作成する事ができます。自動作成で使用するSQL文はファイル( create.sql
)の中に保存し、各データベース毎に以下のディレクトリーに配置して下さい。この時、データベースを表すディレクトリー名は設定値である database
と同じにします。
your-project | ├── assets | ├── sql | | | | | ├── sqlite [SQLite用] | | | | | | | └─ create.sql | | | | | ├── mysql [MySQL用] | | | | | | | └─ create.sql
テーブル自動作成のトリガーは以下の2つです。この何れかに該当する場合に限り、create.sql
が実行されます。create.sql
の書式については SQLファイル を参照して下さい。
db_file
で指定されいるファイルが存在しなかった時check_tables
で指定されいるクエリー結果が空の時
一般的に、db_file
は SQLite のようなファイル共有型のデータベースの場合に使用し、check_tables
は MySQL のようなクライアント-サーバ型のデータベースの場合に使用します。
設定ファイルの initial_data
に設定されているテーブルが空の場合、そのテーブルに初期データを自動的に挿入します。これは、テーブル作成の直後だけでなく、全てのレコードが消されテーブルが空になった場合も含まれることに注意して下さい。
ここでは、create.sql ファイルを使用したデータベースの構築方法について説明しますが、実際のデータベースの構築にあたっては、アプリケーションに応じた戦略を検討して下さい。
Apricotのスケルトンには、ユーザテーブルが含まれています。ユーザテーブルはログイン認証で使用される基本的なテーブルで、Aproctに初期実装されているアプリケーションでは、このテーブルをメンテナンス(新規作成、変更、削除)する機能が実装されています。
Apricotを最初に起動したとき、ユーザテーブルは自動的に作成され、初期データがロードされるように予め設定されています。自動作成するテーブルのSQL文は create.sql
ファイルに格納します。必要に応じて、新しいテーブルを追加するようにして下さい。
以下はuserテーブルの定義です。Apricotのスケルトンで初期設定されているデータベースはSQLiteです。
カラム名 | 型 | 主Key | 属性 | 説明 | |
---|---|---|---|---|---|
SQLite | MySQL | ||||
id | integer | int | ● | autoincrement | ID |
account | text | VARCHAR(255) | unique not null | アカウント | |
password | text | VARCHAR(255) | not null | パスワード | |
text | VARCHAR(255) | Eメールアドレス | |||
note | text | text | 備考 | ||
remember_token | text | VARCHAR(255) | 自動ログイン用 | ||
created_at | text | datetime | not null | 作成日 | |
updated_at | text | datetime | not null | 更新日 | |
version_no | integer | int | default 0 not null | バージョンNo |
account
と password
カラムは、ログイン認証で使用されます。remember_token
は自動ログイン用の認証トークンとして使用されます。created_at
とupdated_at
が 設定されます。created_at
とversion_no
が 設定されます。version_no
はレコードのバージョンを表し、楽観的ロックで使用されます。ユーザテーブルには必要に応じて新しいカラムを追加することができます。
Apricotのスケルトンでは、アプリケーションが使用する全てのテーブルで created_at、updated_at、version_no の3つカラムが存在することを前提しています。この前提を変更する場合は、モデルのベースクラスを変更して下さい。
アプリケーションでは、テーブルを作成したり削除するような生のSQLを直接実行することもあります。このような為に、IdiromではDDL用のSQLを実行するメソッドして raw_execute()
と get_db()
が提供されています。
以下は raw_execute()
の例です。このメソッドは成否を返します。
$successful = ORM::raw_execute('DROP TABLE user');
get_db()
はPHPのPDOオブジェクトを返します。上の例をget_db()
を使用して行うと以下のようになります。PDO の exec()
メソッドは作用した行数または失敗した場合にfalseを返します。
$result = ORM::get_db()->exec('DROP TABLE user');
テーブルの自動作成で使用される create.sql
ファイルは、以下のヘルパー関数によってSQL文の配列として読み込まれます。
関数 | 機能 |
---|---|
file_get_sql(string $filename):array | SQLファイルを読みSQL文の配列を返す |
file_get_sql()
関数 はアプリケーションの中で任意のSQLファイルに使用できます。但し、SQLファイルの保存先は create.sql
ファイルと同じ場所を推奨します。
Idiormのセットアップコードでは、file_get_sql()
関数を使用して以下のように create.sql
を読み込んでSQL文を実行しています。
$sql_text = file_get_sql(assets_dir("sql/{$database}/create.sql")); if (!empty($sql_text)) { foreach($sql_text as $sql) { ORM::get_db()->exec($sql); } }
以下に、Apricotのスケルトンで提供されているSQLite用のSQLファイルを示します。
/your-project/assets/sql/sqlite
/* * User Table */ CREATE TABLE IF NOT EXISTS USER ( id INTEGER PRIMARY KEY autoincrement, account text UNIQUE NOT NULL, password text NOT NULL, email text, note text, remember_token text, created_at text NOT NULL, updated_at text NOT NULL, version_no INTEGER DEFAULT 0 NOT NULL );
-- Comment
)とブロックコメント( /* Comment */
)の両方が使用できます。;
)で区切って複数入力できます。TAB
, Space
, 改行文字
)は1つの空白と同じにみなされます。