Curry
PHP Framework

core

db

html

utility

Model

クラス概要

Modelクラスを利用すると、クラスとデータベーステーブルが1:1で関連付き、テーブルアクセスをシンプルに行うことができる様々なメソッドが利用できます。

Modelクラスの利用方法は2つあります。
一つはModelクラスを継承し、名前規則に従ってテーブル名と結び付けられたクラス名とする方法です。こうすることで自動的にテーブルとクラスが関連付けられます。
もう一つは、継承はせずにModelクラスを利用し、コンストラクタで処理対象のテーブル名を指定する方法です。
前者の方法だと、そのテーブルに関連したSQLを実行する処理を独自のメソッドとして定義できるため、通常はこの方法を利用します。
後者の方法は、前者の方法でメソッドを何も定義しないのと同じ状態のインスタンスとなります。クラスを定義するまでもないほどに処理が単純で少ない場合はこの方法でもよいでしょう。

クラスファイル位置

curry/core/model.php

フィールド

フィールド名 アクセス 概要
$db protected PDO データベースとの接続を保持するPDOクラスのインスタンスです。
Db::isSingletonにtrueを指定した場合や、Model::setDefaultConnectionでデフォルトのインスタンスを設定してある場合はシステムを通して共通のインスタンスとなります。
それ以外の場合は、Modelのインスタンス生成時にPDOインスタンスの生成を都度行い、モデルごとに異なる接続を利用することになります。
$name protected string クラスと関連付けられたデータベーステーブルのテーブル名を保持します。
Modelを継承したクラスを定義した場合、通常はクラス名から処理対象のテーブル名が決定しますが、このフィールドにテーブル名を設定することで、クラス名に関係なく、そのテーブル名が優先され、処理対象となります。テーブル名との関連の命名規則の縛りから外れた自由なクラス名を付けたい場合に設定します。それ以外の場合は特に意識する必要はありません。
$alias protected string テーブルに対してSQL文中で割り当てられる別名です。
selectメソッドを利用したSQL構築機能を利用する場合に、複数のテーブルを結合したSQLでエイリアスを使用する場合に必要となる設定です。
$schema protected string データベーステーブルの存在するスキーマ名。
これを設定することで、SQL文上、テーブル名の前に付加され、「スキーマ名.テーブル名」という形式のテーブル名となります。

この意味するところは使用するRDBMSの種類により異なります。
MySQLの場合はこのスキーマ名の設定はデータベース名の指定として働きます。通常はdatabase.iniで指定したデータベースへ接続しますが、これを指定することで、それとは別のデータベースに存在するテーブルを参照します。
PostgreSQLには別のデータベースを参照するという機能がありませんが、データベースとテーブルの間にスキーマという概念が存在します。スキーマは複数定義することができ、スキーマがことなれば同じテーブル名のテーブルが存在できるため、ここではMySQLのデータベースと同じレベルの概念として扱います。

※バージョン1.1.0以降

メソッド

メソッド名 アクセス 概要
select public SqlSelectクラスのインスタンスを取得します。
SqlSelectクラスはSELECT文実行オブジェクトであり、このクラスに対して様々な条件指定メソッドを実行することでSELECT文を構築し、最終的には実行メソッドによりクエリ結果を配列で取得することができます。
詳細はSqlSelectクラスのリファレンスを参照してください。
find public テーブルの主キーフィールドの値を引数に指定することで、クエリ結果の単一行のデータを取得することができます。
これは、selectメソッドより取得したSqlSelectインスタンスでfetchRowを実行した場合と同様の結果となります。テーブルの主キーを構成するフィールドの数に応じて引数の数も可変となります。
selectメソッドから始まる一連のSELECT文の発行手続きを省略できるため、主キーによってSELECTする場合はこのメソッドで手軽にデータ取得が可能です。
insert public SqlInsertクラスのインスタンスを取得します。
SqlInsertクラスはINSERT文実行オブジェクトであり、このクラスに対して様々な条件指定メソッドを実行することでINSERT文を構築し、最終的に実行メソッドにより、モデルクラスに関連付いているテーブルに対して行の挿入が行われます。
詳細はSqlInsertクラスのリファレンスを参照してください。
update public SqlUpdateクラスのインスタンスを取得します。
SqlUpdateクラスはUPDATE文実行オブジェクトであり、このクラスに対して様々な条件指定メソッドを実行することでUPDATE文を構築し、最終的には実行メソッドにより、モデルクラスに関連付いているテーブルに対して行の更新が行われます。
詳細はSqlUpdateクラスのリファレンスを参照してください。
delete public SqlDeleteクラスのインスタンスを取得します。
SqlDeleteクラスはDELETE文実行オブジェクトであり、このクラスに対して様々な条件指定メソッドを実行することでDELETE文を構築し、最終的には実行メソッドにより、モデルクラスに関連付いているテーブルに対して行の削除が行われます。
詳細はSqlDeleteクラスのリファレンスを参照してください。
setAlias public SQL文中でテーブルに対して設定するテーブルエイリアスを設定します。他のテーブルと結合を行う場合には必要になります。
モデルクラス内で設定する場合はフィールド$aliasの初期値に直接設定するか、メソッド内で$this->aliasに直接設定しても同じ結果です。
getAlias public モデルクラスに設定されているテーブルエイリアスを設定します。
setName public モデルクラスを関連付けるテーブルの名前を設定します。テーブル名とモデルクラス名が一定の名前規則で関連している場合は明示的に名前の設定は必要ありませんが、敢えて名前規則から外れたモデルクラス名の場合は指定する必要があります。
モデルクラス内ではフィールド$nameの初期値に直接指定するか、メソッド中で$this->nameに対して直接設定しても同じ結果です。
getName public モデルクラスに設定されているテーブル名を取得します。
setConnection public モデルインスタンスで利用するデータベース接続オブジェクト(PDOインスタンス)を指定します。通常、モデルクラス内で独自にPDOインスタンスを生成しまが、他のモデルインスタンスと接続を共有してトランザクション処理を行いたい場合などに指定します。 Db::isSingletonをtrueに指定している場合はこのメソッドによる指定は無意味になります。
getConnection public モデルクラスの保持しているデータベース接続(PDOインスタンス)を取得します。
getColumnsInfo public テーブルの列定義情報を取得します。定義情報は列名と、各列の定義情報を格納する2次元配列で構成されます。
各列の情報は以下のようになります。

index - 列番号
name - 列名
table - 列の属するテーブル名
length - 最大長
is_string - 文字列フィールドの場合はtrue、それ以外はfalse
primary_key - 主キーフィールドの場合はtrue、それ以外はfalse
not_null - NULL不可の場合はtrue、それ以外はfalse
getKeyColumns public 主キーを構成するフィールドのフィールド名を配列で取得します。
setDefaultConnection public システム全体において、Modelクラスで使用するデータベース接続インスタンスのデフォルトを設定します。
通常、Modelクラスのインスタンス生成時に都度データベース接続インスタンスを生成し、Modelクラス内に保持しますが、このメソッドでデフォルトの接続インスタンスを設定しておくと、Modelインスタンス生成時に保持する接続インスタンスとして利用されます。
つまり、敢えて別インスタンスを設定しない限りはシステム全体で一つの接続インスタンスを使いまわす形になります。
allowVirtual public 空想モデルクラスの生成を許可するかしないかを設定します。
引数にfalseを設定した場合、仮想モデルクラスの生成を許可しません。
デフォルトはtrueのため、許可する場合は特に設定の必要はありません。
isAllowVirtual public 空想モデルクラスの生成を許可するかしないかを設定を取得します。
selectAll public 対象のテーブルのデータ全件をSELECTし、クエリ結果を取得します。
単純に全件取得したい場合は、selectメソッドからの一連のSELECT分生成ロジックを記述するより手軽です。
selectBy public "selectBy"という名前のメソッドが存在するわけではありません。
selectByの後にフィールド名を"And"でつなげてメソッド名とすることで、
そのフィールド名をWHERE条件として抽出したクエリ結果を得ることができるという特殊なメソッドです。
条件の値の設定方法は引数に直接値を指定するだけです。

例えばageフィールドの値が30、addressフィールドの値が"東京"のデータを抽出したい場合は、

$model->selectByAgeAndAddress(30, '東京');

というようになります。
フィールド名の数と引数の数、順番は一致しなければなりません。
プラスアルファでもうひとつ引数を増やすと、その引数はorderByの指定となります。

$model->selectByAgeAndAddress(30, '東京', 'name ASC');

という風にすると、ORDER BY にnameフィールドを指定していることになります。
findBy public "findBy"という名前のメソッドが存在するわけではありません。
findByの後にフィールド名を"And"でつなげてメソッド名とすることで、
そのフィールド名をWHERE条件として抽出したクエリ結果を得ることができるという特殊なメソッドです。
条件の値の設定方法は引数に直接値を指定するだけです。
selectByメソッドとの違いは、selectByが条件に合致する複数行を取得するのに対し、
findByは1件しか返しません。つまり、基本は一件しか結果を返さないような条件指定が前提になります。
ただし、条件に合致するレコードが複数存在する場合でも、最初の1件を返します。

例えばnameフィールドの値が"山田太郎"、ageフィールドの値が30のデータを一件抽出したい場合は、

$model->findByNameAndAge('山田太郎', 30);

というようになります。
フィールド名の数と引数の数、順番は一致しなければなりません。
setSchema public 対象テーブルの存在するデータベーススキーマを指定します。
システムでメインで使用する空間とは別の空間に存在するテーブルを参照したい場合に指定します。
ここで言うスキーマとはMySQLとPostgreSQLでは意味が異なります。

MySQLの場合は外部DBのDB名、
PostgreSQLの場合は同DB内の別スキーマを指定することになります。

※バージョン1.1.0以降
getSchama public 現在モデルクラスに設定されているスキーマ名を取得します。
スキーマ名の説明についてはsetSchemaメソッドの説明を参照してください。

※バージョン1.1.0以降