【CakePHP辞典】Tips第3回:Model::read()

ModelのTipsが続いてしまいますが、今回はModel::read()についての注意事項です。

通常Modelでデータソースからのデータの読み出しはModel::find()/findBy()を用いるのが一般的だと思いますが、ほかの読み出し方法もいくつか存在しています。その中に今回取り上げます「Model::read()」がありますが、こちらは「プライマリIDを指定してレコード取得」を行うことができます。取得フィールドが指定できるため「find(‘first’, array(‘conditions’ => array(‘id’ =>$id), ‘fields’ => $fields));」に近いと思いますが、意味的にはfindById($id)のほうが近いかもしれません。

取り出し方、結果そのものについてはこれらはそれほど差がありませんが、ひとつだけread()には注意点があります。「Model::validationErrors」プロパティにはモデル保存等でバリデーションエラーが存在する場合にそのエラーメッセージが蓄えられるのですが、read()を実行すると問答無用で初期化します

「Model::validationErrors」プロパティを初期化するメソッドは、「Model::read()」のほか「Model::create()」「Model::saveAll()」の合計3メソッドです。おそらくread()はcreate()のように「モデルを初期化するためのメソッド」という位置づけなのでしょう。create()はコードで初期値を与えますが、read()は既存のレコードから初期値を与える、という感じですかね。なのでバリデーションエラーを保持して読み換えるような場合はread()は使うべきではない、ということになります。find()/findById()のほうがよいと思います。

個人的にはread()はほとんど使わないため「フーン」な仕様なのですが、bakeコマンドでコードを作り出している場合にはread()が含まれたコードを生成するそうなので、注意が必要です。@surface0さん情報ありがとうございました!

当メソッドの解説は「Pocket詳解 CakePHP辞典」の55ページに掲載されています。

ほかにも便利な機能が紹介されている「Pocket詳解 CakePHP辞典」を是非よろしくお願いします!

アマゾンのサーバでエラーが起こっているかもしれません。一度ページを再読み込みしてみてください。

【CakePHP辞典】Tips第2回:Model::save()の追加説明

Pocket詳解 CakePHP辞典」内で、Modelクラスで主要機能でもある「Model::save()」内の解説について、若干足りない部分がありましたので追加させていただきます。

【書式】

$this->save($data, $validate, $fieldList);

【引数】

変数名 初期値 説明
$data array null 保存するデータの連想配列
$validate mixed true バリデーションを行う場合はtrue。また他のオプションを与えたい場合は連想配列で指定。下記参照
$fieldList array array() 保存するフィールド名の配列。nullの場合は現在の$this->whitelistの保存指定を空にする。array()の場合は現在値で保存する

▼$validateに指定できるオプション値

キー名 初期値 説明
validate array null 保存するデータの連想配列
fieldList array array() $fieldListと同じ値を指定する
callbacks array array() コールバックメソッドを実行する場合にtrue。もしくは「before」でbeforeSave()を、「after」でafterSave()を実行する

$validateは、そのものの値はbooleanですが、連想配列を与えることもでき、一般的な$optionsと同じようにオプション値としてふるまいます。この場合は$fieldListは無視されますので、必要なら$validate内に含めます。また「callbacks」というパラメータを与えることもできます。callbacks は通常trueであり「beforeSave()」「afterSave()」コールバックを通過しますが、falseにすることで通過しません。また 「before」「after」とすることでbeforeSave()だけ、afterSave()だけ通過させることもできます。

なお、このcallbacksオプションは「Model::saveAll()」のオプション値としても有効です。何故ならsaveAll()は内部でsave()をコールしているためです。

各メソッドの解説は「Pocket詳解 CakePHP辞典」の58ページおよび61ページに掲載されています。

ほかにも便利な機能が紹介されている「Pocket詳解 CakePHP辞典」を是非よろしくお願いします!

アマゾンのサーバでエラーが起こっているかもしれません。一度ページを再読み込みしてみてください。