レコード処理

モデルを使う

モデルはコントローラ、フォーム、モデル、ユーザ定義関数(、設定ファイル)から使用することができます。現在のクラスからメソッドnewModel(string $name)loadModel(string $name)を呼び出してインスタンスを生成し、そのインスタンスから以下のようにメソッドを実行します。

<?
class ctrlXxx extends CZCtrl {

	public function actionYyy() {
		$this->newModel('model1')->メソッド();
	}

}
?>

インスタンスを保持するかどうかでnewModel()loadModel()を使い分けますが、通常はnewModelで結構です。コンストラクタに引数を渡す場合、newModel()loadModel()の第2以降の引数として指定します。

<?
class ctrlXxx extends CZCtrl {

	public function actionYyy() {
			:
		$this->newModel('form1', $uid, $gid)->メソッド();
			:
	}

}
?>

モデルのコンストラクタで引数を使用する例として以下のようなケースがあります。

<?
class formModel1 extends CZModel {
	public function _construct($uid = NULL) {
			:
		if ($uid) {
			$condition_sentences = array('uid = :uid');
			$condition_values    = array('uid' => $uid);
			$this->setMask($condition_sentences, $condition_values);
		}
			:
	}

}
?>

以下のメソッドで、前ページの設定に基づいて実際にレコードの追加(Create/INSERT)、読込(Read/SELECT)、更新(Update)、削除(Delete)といったレコード処理を行います。

データ形式

モデルで扱うレコードのデータの種類には単一値、レコード、レコードセットの3種類があります。

単一値

1レコードの1カラムの値の形式です。スカラになります。

レコード

1レコードの配列の形式です。詳細は変数のタイプ - レコードを参照してください。

レコードセット

複数レコードの2次元配列の形式です。詳細は変数のタイプ - レコードセットを参照してください。

以下はレコード処理に関するメソッドです。モデルクラスのこれらのメソッドはアクションから呼び出して使用しますが、これらをもとにモデルクラスのメソッドを上書きしたり新たにメソッドを作って呼び出したりすることも可能です。

レコードの作成(Create)

データベースにおけるINSERT処理になります。

CZModel::insert(array $record)
レコードを新規追加します。レコード形式の連想配列$recordの内容を新規レコードとして追加します。$recordにレコードセット形式の2次元配列を指定することで複数レコードを追加することができます。また値をSQL形式の連想配列で指定することもできます。レコード追加に成功した場合レコード数を、失敗した場合は0を返します。
<?
class ctrlXxx extends CZCtrl {

	public function actionYyy() {
		$record = array(
			'last_name'		=> 'Yamada',
			'first_name'	=> 'Taro',
			'member_type_id'=> 11,
			'phone_number'	=> '0311112222',
			'regdate'		=> array('sql' => 'date()'),
		);
		$this->newModel('model1')->insert($record);
	}

}
?>
ChimpanzeeではPDOを使用しているためINSERT時にタイムスタンプを値として登録することができないため、代わりにこのようにして登録日時を挿入することになります。
CZModel::insertSelect(string $get_table_name, array $set_column_names = NULL, $get_column_names = array(), $condition_sentences = array(), $condition_values = array(), $options = array())
現在の(実行しているインスタンスのモデルの)テーブルに他のテーブルのデータを追加するINSERT ... SELECT文を実行します。$get_table_nameでデータの取得元のテーブル名(モデル名ではありません)を指定します。$set_column_namesでデータの挿入先テーブルのカラム名を、$get_column_namesでデータの取得元テーブルのカラム名をそれぞれ順番に指定します。$condition_sentences$condition_valuesでデータの取得元の条件を指定できます。指定方法は絞り込み条件の指定方法を参照してください。$optionsでSELECT文のオプション句を指定できます。指定方法はオプション句の指定方法を参照してください。戻り値として取得元データのレコード数を整数で返します。

レコードの更新(Update)

データベースにおけるUPDATE処理になります。

CZModel::update(array $record, $condition_sentences = array(), $condition_values = array(), $options = array())
$condition_sentences$condition_valuesで指定した条件のレコードについてレコード形式の連想配列$recordの内容で更新します。$recordでは値にSQL形式の連想配列での指定もできます。条件の指定方法については絞り込み条件の指定方法を参照してください。レコード更新に成功した場合レコード数を、失敗した場合は0を返します。
<?
class ctrlXxx extends CZCtrl {

	public function commitIndex() {
		$set_values = array(
			'pc_mail_addr'             => array('sql' => 'pc_mail_addr_tmp'),
			'pc_mail_addr_tmp'         => NULL,
			'pc_mail_addr_commit_code' => NULL,
		);
		$condition_sentences = array(
			'user_id = :user_id',
			'pc_mail_addr_tmp IS NOT NULL',
			'pc_mail_addr_commit_code = :pc_mail_addr_commit_code',
		);
		$conditon_values = array(
			'user_id'                  => $_GET['ui'],
			'pc_mail_addr_commit_code' => $_GET['cc'],
		);
		$this->newModel('m_user')->update($set_values, $condition_sentences, $conditon_values, $options);
	}

}
?>
$options['limit']で「UPDATE ... LIMIT xxx;」という指定ができます。
$options = array('limit' => 100)
で100件更新ということになります。
CZModel::updateById(int $id, array $record)
IDが$idのレコードについてレコード形式の連想配列$recordの内容で更新します。レコード更新に成功した場合レコード数を、失敗した場合は0を返します。
<?
class ctrlXxx extends CZCtrl {

	public function actionYyy() {
		$record = array(
			'last_name'		=> 'Yamada',
			'first_name'	=> 'Taro',
			'member_type_id'=> 11,
			'phone_number'	=> '0311112222',
		);
		$this->newModel('model1')->updateById(5, $record);
	}

}
?>

レコードの削除(Delete)

データベースにおけるDELETE処理になります。

CZModel::delete($condition_sentences = array(), $condition_values = array())
$condition_sentences$condition_valuesで指定した条件のレコードを削除します。条件の指定方法については絞り込み条件の指定方法を参照してください。レコード削除に成功した場合レコード数を、失敗した場合は0を返します。
<?
class ctrlXxx extends CZCtrl {

	public function deleteIndex() {
		$condition_sentences = array(
			'score < :score',
			'black IS TRUE',
		);
		$conditon_values = array(
			'score' => $_GET['score'],
		);
		$this->newModel('m_user')->delete($condition_sentences, $conditon_values);
	}

}
?>
CZModel::deleteById(int $id)
IDが$idのレコードを削除します。レコード削除に成功した場合レコード数を、失敗した場合は0を返します。
<?
class ctrlXxx extends CZCtrl {

	public function actionYyy() {
		$this->newModel('model1')->deleteById(5);
	}

}
?>

レコードの取得(Read)

データベースにおけるSELECT処理になります。単一値とレコードを取得するメソッドを取り上げます。一覧取得や検索といった複数行にかかわるレコード処理を行う場合は複数レコードの取得を参照してください

CZModel::getRecord($column_names = array(), $condition_sentences = array(), $condition_values = array(), $format_flag = TRUE)
(returns array)指定した条件に合致した1つのレコードを取得します。条件を指定しない場合、先頭のレコードを返します。
CZModel::getRecordById(int $id, $column_names = array(), $format_flag = TRUE)
(returns array)指定したIDの1つのレコードを取得します。
CZModel::getValue(string $column_name, $condition_sentences = array(), $condition_values = array(), $format_flag = TRUE)
(returns string)指定した条件に合致した1つのレコードの指定カラムの値(単一値)をスカラで取得します。
CZModel::getValueById(int $id, string $column_name, $format_flag = TRUE)
(returns string)指定したIDの指定カラムの値(単一値)をスカラ取得します。
CZModel::getRecords(array $column_names = NULL, array $condition_sentences = NULL, array $condition_values = NULL, array $options = NULL)
(returns array)指定した条件に合致した複数のレコードをレコードセット型の2次元配列で取得します。条件を指定しない場合全件取得になります。
CZModel::getTable(string $id_column_name, string $value_column_name, $condition_sentences = array(), $condition_values = array(), $options = array())
(returns array)IDと指定したカラムの値の一覧を定数テーブル型の配列で取得します。$id_column_nameでIDのカラム名を、$value_column_nameで値のカラム名を文字列で指定します。特定のカラムを定数テーブルとして取得したい場合に利用します。$condition_sentences$condition_valuesで抽出するレコードを絞り込むこともできます。
CZModel::format(array $record)
(returns array)CZModel::getRecord($column_names = array(), $condition_sentences = array(), $condition_values = array(), $format_flag = TRUE)CZModel::getRecordById(int $id, $column_names = array(), $format_flag = TRUE)で取得したレコード形式の配列を与えると、CZModel::setFormats(array $formats)で指定した形式でフォーマットを行って値を返します。

上記のメソッドで使用する引数は以下のとおりです。

$column_names
(array) 取得するカラム名を要素とする配列で、
$column_names = array('column_name1', 'column_name2', ...)
の形式で指定します。これを指定しない場合、全カラムを取得します。
$column_name
(string) 取得するカラム名
$condition_sentences, $condition_values
(mixed, array) 絞り込み条件の指定方法を参照してください。
$mask_flag
(bool) TRUEもしくは指定しない場合、このメソッドを実行する時点で設定されているマスク条件で絞り込んだうえでレコードを取得します。FALSEの場合、マスク条件での絞り込みはせずにレコードを取得します。取得するレコードの権限を設定する意味があるため通常はセキュリティ上FALSEにしないことを推奨しますが、ログイン処理でユーザマスタなどを参照する際などFALSEにしなければならないこともあります。
$id
(int) 取得するレコードのIDを指定します。引数として含まれるメソッドでは必須の引数となります。
$format_flag
(bool) TRUEもしくは指定しない場合、CZModel::setFormats(array $formats)で指定したフォーマットを行って値を返します。FALSEの場合はフォーマットをしないままの値を返します。通常は指定しませんが(フォーマット済み)、ユーザ関連処理などでフォーマットされた値では都合が悪い場合にFALSEを指定します。
$options
(array) レコードを取得する際のSELECT文のオプション句となる「DISTINCT」「GROUP BY」「HAVING」「ORDER BY」「LIMIT」「OFFSET」の条件を連想配列で指定します。条件の種類(「ORDER BY」など)をキーとし、条件の内容を値とする連想配列になります。要素は
distinct_flag (bool) (option)
取得するレコードを「DISTINCT」とする場合にTRUEを指定します。
group_column_names (array) (option)
「GROUP BY」で指定するカラム名を1個ずつ要素として順番に指定します。
having_condition_sentences (array) (option)
having_condition_values (array) (option)
両要素で「HAVING」の内容を指定します。having_condition_sentences$condition_sentencesと、having_condition_values$condition_valuesと置き換えてモデルの絞り込み条件の指定方法と同じ形式で指定をします。
order_sentences (array) (option)
「ORDER BY」で指定するカラム名を1個ずつ要素として順番に指定します。
limit (int) (option)
「LIMIT」で指定する数値を指定します。
offset (int) (option)
「OFFSET」で指定する数値を指定します。
たとえば
$options = array(
	'group_column_names'			=> array('VENDOR', 'TYPE'),
	'having_condition_sentences'	=> array(
		'x_score > (SELECT AVG(x_score) FROM t1)',
		'y_score < (SELECT AVG(y_score) FROM t1)',
	),
	'order_sentences'				=> array('VENDOR', 'TYPE'),
	'limit'							=> 100,
	'offset'						=> 1000,
);
となります。

フォームと連携したレコード処理

一般的にレコードの追加と更新処理ではフォームを利用します。そこでフォームの入力値をそのまま引数として渡すとレコードに登録するメソッドを用意しています。

CZModel::commitInsert(array $form_values, $add_values = array())
フォームの入力値$form_valuesを新規レコードとしてデータベースに追加します。$add_valuesを指定した場合、入力された(変数に対応する)カラム以外のカラムに値を書き込みます。連想配列$add_valuesの形式は、キーがカラム名、値が対応する値
$add_values = array(
	'column_name1' => 値1,
	'column_name2' => 値2,
		:
);
となります。$add_valuesでは値にSQL形式の連想配列での指定もできます。登録時のタイムスタンプを付加する場合は以下のようになります。
$add_values = array(
	'regdate' => array('sql' => 'date()'),
);
ChimpanzeeではPDOを使用しているためINSERT時にタイムスタンプを値として登録することができないため、代わりにこのようにして登録日時を挿入することになります。
CZModel::beginUpdate(int $id)
指定したIDのレコードについて更新処理の準備をします。このメソッドを実行すると、次にCZModel::commitUpdate($form_values, $add_values = array())を実行する時にここで指定したレコードが更新されます。編集画面でフォームの初期値として表示できるように指定したレコードの内容を返します(CZModel::getRecordById($id)を実行するのと同じ結果を返します)。
CZModel::commitUpdate(array $form_values, $add_values = array())
直前に実行したメソッドCZModel::beginUpdate($id)で指定したレコードについてフォームの入力値$form_valuesでデータベースを更新します。$add_valuesを指定した場合、入力された(変数に対応する)カラム以外のカラムに値を書き込みます。$add_valuesでは値にSQL形式の連想配列での指定もできます。
CZModel::isBegunUpdate()
現在更新処理の準備が行われている(beginUpdate(int $id)されているがcommitUpdate(array $form_values, $add_values = array())されていないものがある)かどうかを返します。処理の準備が行われている場合TRUEを、処理の準備が行われていない場合FALSEを返します。
CZModel::loadUpdateId()
現在更新処理の準備が行われている(beginUpdate(int $id)されているがcommitUpdate(array $form_values, $add_values = array())されていない)IDを返します。

追加処理はcommitのみ、更新処理はbeginをしてからcommitをする流れになります。

また削除処理は

レコードの(一覧もしくは詳細)表示画面 ▼ 確認画面(指定したレコードの表示) ▼ 完了

という流れになりますが、この流れに即したレコード削除用のメソッドを用意しています。

CZModel::beginDelete(int $id)
指定したIDのレコードについて削除処理の準備をします。このメソッドを実行すると、次にCZModel:: commitDelete()を実行する時にここで指定したレコードが削除されます。確認画面で表示できるように指定したレコードの内容を返します(CZModel::getRecordById($id)を実行するのと同じ結果を返します)。
CZModel::commitDelete($relation_models = array())
直前に実行したメソッドCZModel::beginUpdate($id)で指定したレコードについて削除処理を完了します。
引数$relation_modelsで参照整合性制約の「ON DELETE RESTRICT」の処理ができます。たとえばテーブルAのカラムidがテーブルBのカラムa_idとテーブルCのカラムa_idを参照している場合、
$a_model = $this->newModel('テーブルAのモデル');
$a_model->beginDelete($id);

	:

$b_model = $this->newModel('テーブルBのモデル');
$c_model = $this->newModel('テーブルCのモデル');

$a_model->commitDelete(array(
	array($b_model, 'a_id'),
	array($c_model, 'a_id'),
));
とすることで、テーブルBのカラムa_idまたはテーブルCのカラムに$a_modelのIDが存在するレコードがあれば、テーブルAのDELETE文は実行されずこのメソッドはエラーのFALSEを返します。
CZModel::isBegunDelete()
現在削除処理の準備が行われている(beginDelete(int $id)されているがcommitDelete($relation_models = array())されていないものがある)かどうかを返します。処理の準備が行われている場合TRUEを、処理の準備が行われていない場合FALSEを返します。
CZModel::loadDeleteId()
現在削除処理の準備が行われている(beginDelete(int $id)されているがcommitDelete($relation_models = array())されていない)IDを返します。

削除処理はbeginをしてからcommitをする流れになります。

前後のページ

ページトップへ