モデル

モデルはデータベースとの接続等、データ処理を制御する機構です。モデルはCZModelクラスで制御します。

モデルクラスの実装方法

データベースの一つのテーブルにつき一つのモデルクラスを定義します。モデル名をxxxとした場合クラス名はXxxとなり(モデルクラスのプレフィクスを付けるとmodelXxx)、クラスファイルは

(app_root)/models

内にXxx.phpという名前で設置します。モデルのクラスは以下の構造になります。

<?
class modelXxx extends CZModel {

	public function _construct() {
		$this->setTable('m_item', 'item_id'); 
		$this->setUniques(array('uq_item_code' => 'item_code'));
		$this->setFormats(array(
			:
		));
		$this->addRecords(array(
			:
		));
		$this->setMask(array(
			:
		));
			: 
	}

	public function search() {
		:
	}
		:
}
?>

コンストラクタ_construct()で各種設定メソッドを実行することでモデルの設定を行います。各種設定メソッドは実行元インスタンスのオブジェクトを返しますので、メソッドチェインの形で設定を行うこともできます。

$this->setTable('m_item', 'item_id')
	->setUniques('uq_item_code' => array('item_code'))
	->setFormats(array(
		:
	))
	->setMask(array(
		:
	));

その後必要に応じてデータ処理を行うメソッドを記述しますが、あらかじめCZModelクラスに用意されているメソッドのみでも基本的なデータベース処理は可能なので_construct()の定義のみでもモデルとして十分機能します。

モデルの設定

モデルに関する設定は_construct()に記述するCZModelクラスのメソッドを使って行います。

CZModel::setTable(string $table_name, string $id_column_name)
モデルの基本設定を行います。モデルに対応するテーブル名を$table_nameで、IDのカラム名を$id_column_nameで指定します。いずれも必須です。IDは通常プライマリキーを指定することになりますが、ユニークであれば指定可能です。実行時、実行元インスタンスのオブジェクトを返します。
CZModel::setUniques(array $uniques)
値がユニーク(一意性制約)となるカラム名を連想配列で指定します。形式はキーをユニークインデックス名(名前は任意で結構です)、値をカラム名とする連想配列です。
$uniques = array(
	'unique_name1' => 'column_name1',
	'unique_name2' => 'column_name2',
		:
);
組み合わせでユニークとなる場合は値に組み合わせの配列を指定します。 カラムcolumn_name1が独立してユニーク、 カラムcolumn_name2column_name3の組み合わせがユニーク となる場合は
$uniques = array(
	'unique_name1' => 'column_name1',
	'unique_name2' => array('column_name2', 'column_name3'),
);
となります。実行時、実行元インスタンスのオブジェクトを返します。
CZModel::setCaptions(array $captions)
メソッドCZModel::getHtml()で取得する詳細表示HTML内のカラムとそれに付けるキャプションを連想配列で指定します。 連想配列の形式は、キーが表示するカラム名、値がカラムに対応するキャプションの文字列
$captions = array(
	'column_name1' => 'カラム1のキャプション',
	'column_name2' => 'カラム2のキャプション',
		:
);
となります。変数は表示するがキャプションを表示しない場合、値に空文字「''」をセットします。 このメソッドを実行しない場合はすべてのカラムが表示されますが、 メソッドを実行した場合にはカラム名とキャプションの組を設定していないとそのカラムは表示されません
$captions = array(
	'column_name1' => '',
		:
);
実行時、実行元インスタンスのオブジェクトを返します。
CZModel::setFormats(array $formats)
カラムの表示形式を連想配列で指定します。カラム名をキーとし、表示形式を定義する連想配列(display format definition array)を値とする連想配列になります。
$formats = array(
	'column_name1' => 表示形式定義配列1,
	'column_name2' => 表示形式定義配列2,
		:
);
表示形式定義配列の形式は
$formats = array(
	'head_str'	=> (string) (option),
	'tail_str'	=> (string) (option),
	'ctable'	=> (array) (option),
	'convert'	=> (filter) (option),
);
要素は
head_str (string) (option)
カラムの値の前に付ける文字列を指定します。指定しない場合、何も表示しません。
tail_str (string) (option)
カラムの値の後に付ける文字列を指定します。指定しない場合、何も表示しません。
ctable (array) (option)
カラムの値がIDで、定数テーブルからIDに対応した値を参照して表示する際に使用します。 定数テーブルそのものを配列で指定します。定数テーブルの定義の仕方は定数テーブルの実装方法を参照してください。 指定しない場合はそのようなマッピング処理を行いません。この要素を指定した場合、要素convertは指定できません(排他)。
convert (filter) (option)
カラムの値に変換等の処理を加えて表示する際に、その変換のルールを連想配列(フィルタ配列)で指定します。 フィルタ配列の定義の仕方はコンバート関数のフィルタ配列を参照してください。 指定しない場合は変換処理を行いません。この要素を指定した場合、要素tableは指定できません(排他)。
実行時、実行元インスタンスのオブジェクトを返します。
CZModel::setMask(array $condition_sentences, $condition_values = array())
指定した条件で処理対象とするレコードをあらかじめ絞り込みます(マスク)。 たとえばログインしたユーザの権限で処理可能なレコードを絞り込んでおく(自分のIDでは自分のレコードしか編集できない)場合などに使用します。
条件の指定形式は検索条件の指定方法を参照してください。実行時、実行元インスタンスのオブジェクトを返します。

CZModel::commitInsert(array $form_values, $add_values = array())CZModel::commitUpdate(array $form_values, $add_values = array())を用いてフォームの入力値からレコードを登録する際、これらのメソッドの引数(フォームの入力値)$form_valuesとレコードのマッピングと、それに伴う一意性(制約)バリデーションについて設定することができます。詳細はフォームと連携したレコード処理を参照してください。

CZModel::setFormModelSetValues(array $values)
CZModel::commitInsert(array $form_values, $add_values = array())commitUpdate(array $form_values, $add_values = array())の引数$form_valuesと登録するレコードのマッピングを設定します。 フォーム→モデルの対応関係を指定することになります。形式は目的のカラム名をキー、変換のルールを指定するスカラもしくは配列を値とするもので、値の形式によって変換の挙動が変わります。
$values = array(
	'column_name1' => (scalar) 固定値,
	'column_name2' => (array) 対応ルール,
		:
);
値がスカラの場合、キーで指定した名前のカラムに、定数としてフォームとは無関係にその値を登録します。
値が連想配列の場合、参照またはフィルタでフォームのカラムとの対応や変換を指定できます。
'column_name2' => array ('ref' => '変数名')
'column_name2' => array(
	'convert'	=> array(
		'func'		=> 関数名,
		'params'	=> パラメータ,
	),
),
参照配列refで指定する場合、指定したフォームの変数の入力値をそのままカラムの値として登録します。参照するフォームの変数名($part_name)を文字列で指定することになります。
フィルタ配列convertで指定する場合、フォームの入力値に変換処理を加えてカラムに登録する際の変換ルールをここで指定します。 指定されたコンバート関数にしたがってコンバートされた値をデータベースに登録します。 たとえば、フォーム変数birth_yearbirth_monthの値をくっつけて「birth_yearbirth_month月1日」と変換してカラムbirth_dateに登録することにします。 変換用関数cz_date_join($params)(ただし$params = array('year' => 年の値, 'month' => 月の値, 'day' => 日の値))を用いて
'column_name2' => array(
	'convert'	=> array(
		'func' 		=> 'cz_date_join',
		'params'	=> array(
			'year'  => array('ref' => 'birth_year'),
			'month' => array('ref' => 'birth_month'),
			'day'   => 1,
		),
	),
),
となります。コンバート関数の詳細はフレームワーク実装済みのコンバート関数関数を自作する場合を参照してください。
実行時、実行元インスタンスのオブジェクトを返します。このメソッドで指定しないものは後述するsetFormIgnorePartNames(array $names)で除外しない限りフォームの変数名と同じ名前のカラムに値がそのまま入ります。変数名に一致するカラム名がない場合はエラーとなります。
CZModel::setFormIgnorePartNames(array $names)
フォーム→モデルに登録する際に除外(無視)する変数名を配列で指定します。形式は変数名を要素とする配列です。
'ignore_form_part_names' => array( 'column_name1', 'column_name2', ...)
実行時、実行元インスタンスのオブジェクトを返します。convertを使用して変数をまとめて一つの値としてカラムに登録した場合に残った変数を破棄するものです。カラムに登録しない変数が生じた場合はこのオプションで明示する必要があります。
CZModel::setFormSetValues(array $values)
CZModel::getRecord()CZModel::getRecordById()で取得したレコードとCZForm::initValues($replace_values = array())で代入するフォームの初期値のマッピングを設定します。 モデル→フォームの対応関係を指定することになります。形式は目的の変数名をキー、変換のルールを指定するスカラもしくは配列を値とするもので、 CZModel::setFormModelSetValues(array $values)の引数$valuesと同じ形式になります。 ただし参照配列array('ref' => ...)で参照する際はカラム名を指定します。 ここに設定がないもの(フォームの定義にない変数がモデルからgetRecord()される$replace_valuesに含まれる場合)は無視されます。 実行時、実行元インスタンスのオブジェクトを返します。
CZModel::setFormUniqueErrMsgs(array $msgs)
モデルに値を登録する際、一意性制約に反した場合に表示するエラーメッセージを連想配列で指定します。連想配列の形式は 'ユニークインデックス名' => array('変数名' => 'エラーメッセージ')という形式の連想配列です。 ユニークインデックスはCZModel::setUniques(array $uniques)で定めた名前で指定します。
'unique_err_msgs' => array(
	'user_name' => array(
		'user_name' => 'このユーザー名は使用できません。'
	),
),
組み合わせに対する一意性制約の場合、一つの組み合わせに対して複数個所に表示する設定も可能です。
'unique_err_msgs' => array(
	'user_name' => array(
		'user_name1 => 'このユーザー名は使用できません。'
		'user_name2' => 'このユーザー名は使用できません。'
	),
),
指定しない場合、フレームワークデフォルトのエラーメッセージが表示されます。実行時、実行元インスタンスのオブジェクトを返します。
このメソッドを有効にするためにはモデルとフォームの連携をする必要があります。

設定したプロパティの取得

CZModel::getTableName()
当該モデルのテーブル名を文字列で取得します。
CZModel::getIdColumnName()
当該モデルのIDとなるカラム名を文字列で取得します。
CZModel::getFormats()
当該モデルのテーブル名を文字列で取得します。
CZModel::getUniques()
値がユニーク(一意性制約)となるカラムの設定を取得します。CZModel::setUniques($uniques)の引数$uniquesと同じ形式の連想配列です。
CZModel::getCaptions()
詳細表示HTML内のカラムとそれに付けるキャプションの設定を取得します。CZModel::setCaptions($captions)の引数$captionsと同じ形式の連想配列です。
CZModel::getMaskConditionSentences()
マスク条件の条件指定配列を取得します。CZModel::setMask($condition_sentences, $condition_values = array())の引数$condition_sentencesと同じ形式の連想配列です。
CZModel::getMaskConditionValues()
マスク条件の条件値配列を取得します。CZModel::setMask($condition_sentences, $condition_values = array())の引数$condition_valuesと同じ形式の連想配列です。
CZModel::getFormModelSetValues()
CZModel::setFormModelSetValues(array $values)で指定した引数$valuesを取得します。
CZModel::getFormIgnorePartNames()
CZModel::setFormIgnorePartNames(array $names)で指定した引数$namesを取得します。
CZModel::getFormSetValues()
CZModel::setFormSetValues(array $values)で指定した引数$valuesを取得します。
CZModel::getFormUniqueErrMsgs()
CZModel::setFormUniqueErrMsgs(array $msgs)で指定した引数$msgsを取得します。

絞り込み条件の指定方法

モデルクラスではマスクや検索などで処理をするレコードの絞り込みを行うことがあります。引数$condition_sentences$condition_valuesが指定されているメソッドです。こういったメソッドで絞り込み条件を指定するには、$condition_sentencesで条件の文字列(の組み合わせ)を配列として指定します。

$condition_sentences = array(
	'column_name1 > 120',
	'column_name2 = :x',
	'column_name3 LIKE :y',
		:
);

SQL文のWHERE節にAND条件で入れる内容を配列の要素として加えていきます。上の例は以下のWHERE節を生成することになります。

WHERE (column_name1 > 120) AND (column_name2 = :x) AND (column_name3 LIKE :y)

上記の例のcolumn_name1のように固定の条件で指定することもできますし、column_name2column_name3のように変数を使って条件を指定することもできます。この場合「:x」「:y」のようなPDOのコロン付きパラメータで指定します。

コロン付きパラメータの値は$condition_valuesで指定します。形式はキーをコロンを外したパラメータ名、値を代入する値とする連想配列です。

$condition_values = array(
	'x' => $x,	// 「:x」に代入する値の指定
	'y' => $y,	// 「:y」に代入する値の指定
);

コロン付きパラメータを使用した場合はパラメータの値をPDOがエスケープ処理するため、ユーザが入力した文字列と比較して検索する場合ではコロン付きパラメータを使って代入することがセキュリティ上推奨されます。

前後のページ

ページトップへ