Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

データベースとモデル

モデルとは

モデルはデータを取り出す、データの保存など、データのやり取りをする役割である。
モデルを使うことで、データベース言語を記述する必要がなくなり見通しの良いプログラムができる。
モデルクラスはAppModelを継承してつくる。AppModelにはfindやsaveなどデータとやりとりするメソッドが定義されている。
これらの関数を実行するとsql文が発行される仕組みになっている。

CakePHPにおける命名規則の基本的な考え方

  • モデル名は単数形、それ以外でデータを扱うものは複数形にする
  • クラスとして定義されているファイルはキャメルケース、クラスとは直接的に関係のないものはアンダースコアケース。
  • Viewのフォルダ名は単数形

データベース操作関数のポイント

conditionsによる条件設定

シンプルな条件の書き方

'Board.name like' => '%ABC%'

複雑な条件の書き方

'Board.name like ?' => array('%ABC%')
この条件から生成されるsql文

where 'Board'.'name' like '%ABC%'

つまり「?」の部分に配列の値が入る。

以下のように文字列に変数を埋め込まなくても
$data = $this->Board->find('all',array('conditions'=>array("Board.id between {$first} and {$end}")));

"Board.id between ? and ?"=>array(2,5)
のように書くことができる。

マジック検索
「このフィールドの値が〇〇のもの」とうい単純な検索を利用する場面は多い。その際、conditionsで都度条件を書くのは労力がいる。マジック検索を条件を書かずにデータを取得することができる。

findAllByフィールド名(値)

(例) findAllByName("kuma")

データの更新

idが同じであれば、値の追加と同様にモデル名->save($this->data)の一文でデータの更新ができる。
ただ、カラム名をIDと大文字していた場合、idとは別カラムと認識されてしまい更新されなかった。

学び
カラム名は小文字に統一しよう。

https://oki2a24.com/2012/08/29/table-column-should-be-lower-case-character-in-cakephp2/

その他便利関数

  • 条件に一致したものを全て更新 updateAll(更新内容の配列、条件の配列)
  • 条件に一致したものを全て削除 deleteAll(条件)
  • 特定のフィールドのみ更新 saveField(フィールド名,値)

モデルのクラス変数について

命名規則に沿った書き方をすれば、よしなにテーブルやフィールドを特定してデータのやり取りができた。
設定なしに自動でテーブル設定などができるのは便利な反面、柔軟性に欠けている。
モデルのクラス変数を使うことで自動設定された情報を書き換えることが可能だ。

  • データベースの指定 $useDbConfig = "使用する変数名" データベースの設定は、database.phpのDATABASE_CONFIGというクラスに$defalutという変数に連想配列ではいっている。これとは別に、あらかじめ$mysettingなどの変数を作って設定を保存しておけば、$useDbConfigでデータベースの変更をすることが可能である。
  • テーブルの指定 $useTable = テーブル名 CakePHPではモデル名から推測してテーブルを指定するが、$useTable変数に設定すれば他テーブルを使うこともできる。
  • レコードの並び順を指定 $order = 並び順の指定 このクラス変数を設定しておくことでデフォルトの並び順をしていできる。$order = モデル名.カラム名とすることでカラムごとに設定することもできる。そのため、クエリを発行するたびに並び順の設定をする必要がなくなる。

コールバックメソッドについて

データ操作の前後で実行されるメソッドがある。

beforeFindではfindを実行する前に、limitを設定するなどのクエリの調整をすることができます。
afterFindでは、取得したデータの編集ができます。
beforeSaveは保存処理の前に実行され、特定の条件の場合保存するなどの制御ができます。

そのほかに、afterSave、onError、beforeDelete、afterDelteなどがあるこれらも、同様の考え方で使える。

バリデーション

バリーデンションとは入力された値をチェックする仕組みである。モデルで定義して使う。
コントローラからモデルに保存処理が実行されると、モデル内のバリデーションで値チェックをされて
チェックを通れば、データベースへ保存される。チェックを通らなければレコードを追加できないとみなされメッセージが表示される。

バリデーションの設定

バリデーションはモデルで$validateプロパティに以下のように設定るする。

public $validate = array(
 'フィールド名' => array(
   'rule' => '〇〇',
   'required' => true,
   'on' => 'create',
   'message' => '〜〜〜です'
 )
)

ruleは必須項目で、ここで値チェックのルール、例えば空を許さない、記号を許さない、クレッジトカード番号かどうかなどを設定する。
また、ruleは数多く準備されているので実際に使う時に都度調べて利用すると良い。
ruleは独自に生成することも可能である。その際は、正規表現または独自メソッドを利用する。

正規表現パターン

'rule'にcustomという値を利用して、2つめの要素に独自の正規表現のパターンを書く。

'rule' => array('custom','正規表現のパターン')

独自メソッドパターン

第一引数で渡された値に対して、なにかしらのチェックを行いチェックを通ればtrueを返す。

public function バリデート名($data,引数1,引数2){
   //何かしらの値チェック処理
   return 真偽値;
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away