CakePHPのModelを 使 う データベース 関 連 処 理 をシンプルに 解 決 Copyright YusukeAndo. 2007. All rights reserved. 2007 年 3 月 28 日 安 藤 祐 介 1
アジェンダ CakePHPのおさらい データベース 抽 象 化 レイヤ 機 能 クエリ 実 行 機 能 validation アソシエーション まとめ Copyright YusukeAndo. 2007. All rights reserved. 2
CakePHPのおさらい Copyright YusukeAndo. 2007. All rights reserved. 3
状 況 Scafolding 機 能 等 を 持 つRoR 世 代 のフレームワーク 環 境 に 依 存 しないで 動 作 する (PHP4/5) 外 部 ライブラリなどを 必 要 としないフルスタックなフレー ムワーク とにかく 簡 単 に 利 用 可 能 かつ 拡 張 性 も 十 分 日 本 国 内 での 利 用 も 拡 大 中 Copyright YusukeAndo. 2007. All rights reserved. 4
Googleのトレンド 情 報 直 近 のデータの 絞 込 みが 出 来 るように 日 本 語 での 検 索 トレンド2 位 (2007/3 現 在 ) Copyright YusukeAndo. 2007. All rights reserved. 5
コードのイメージ app/models/memo.php classmemoextendsappmodel{ var$name='memo'; var$belongsto=aray('user'); リレーション 指 定 app/models/user.php classuserextendsappmodel{ var$name='user'; var$validate=aray( 'login_id'=>'/^[a-za-z0-9]*$/', 'password'=>'/^[a-za-z0-9]*$/', 'name'=>valid_not_empty, ); Copyright YusukeAndo. 2007. All rights reserved. 6
コードのイメージ app/controlers/memos_controler.php classmemoscontrolerextendsappcontroler{ var$scafold; var$name='memos'; Scafoldの 利 用 クラス 名 の 指 定 functionindex() { // 表 示 データを 取 得 $data=$this->memo->findal(nul,nul,'memo.iddesc'); $this->set('data',$data); Copyright YusukeAndo. 2007. All rights reserved. 7
実 行 例 少 ないコード 量 でWEBアプリが 作 成 可 能 Copyright YusukeAndo. 2007. All rights reserved. 8
データベース 抽 象 化 レイヤ 機 能 Copyright YusukeAndo. 2007. All rights reserved. 9
データベースの 抽 象 化 データベースの 種 類 を 問 わない 実 装 を 提 供 PEAR:DBやPDOなどが 広 く 認 知 パラメータを 元 に 各 DB 用 の 処 理 を 内 部 で 判 別 CakePHPはライブラリを 必 要 とせずに 抽 象 化 を 実 現 CakePHPは app/config/database.php 内 の 設 定 によ り 下 記 のデータベースを 利 用 可 能 mysqlpostgressqliteadodbpearmssqlodbc 主 要 なデータベースをカバーし PEAR ADOdb 等 も 利 用 可 能 Copyright YusukeAndo. 2007. All rights reserved. 10
データベース 設 定 の 記 述 例 app/config/database.php classdatabase_config { var$default=aray('driver'=>'mysql', 'connect'=>'mysql_connect', 'host'=>'localhost', 'login'=>'dbuser', 'password'=>'hoge', 'database'=>'beefcury', 'prefix'=> '); 利 用 するドライバ 永 続 接 続 など 接 続 先 設 定 テーブル 名 の 接 頭 語 var$test=aray('driver'=>'mysql', 'connect'=>'mysql_connect',. PEARを 利 用 する 場 合 は pear-mysqlのように 記 述 複 数 の 設 定 を 記 述 可 Copyright YusukeAndo. 2007. All rights reserved. 11
複 数 のデータソースのサポート 複 数 のデータソースが 必 要 な 状 況 複 数 のデータベースを 同 時 扱 う 場 合 運 用 時 と 開 発 時 で 接 続 先 を 切 り 替 える 場 合 検 索 機 能 などで 参 照 用 データベースへ 接 続 する 場 合 上 記 の 様 な 場 合 はdatabase.php 内 に 複 数 の 設 定 を 記 述 して おく 事 で 設 定 ファイルの 都 度 書 換 えなどをせずに 対 応 可 能 ( 特 に 指 定 しない 場 合 は $defaultが 使 用 される ) Copyright YusukeAndo. 2007. All rights reserved. 12
Modelの 使 用 する 設 定 の 指 定 app/models/memo.php(モデル 毎 に 指 定 する 場 合 ) classmemoextendsappmodel{ var$name='memo'; var$belongsto=aray('user'); var$usedbconfig= test ; 使 用 する 設 定 の 名 称 app/app_model.php(アプリ 全 体 に 適 用 する 場 合 ) classappmodelextendsmodel{ function _construct(){ if(debug>0){ $this->usedbconfig="test"; parent:_construct(); デバッグモードであれば 開 発 用 DBへ 接 続 Copyright YusukeAndo. 2007. All rights reserved. 13
クエリ 実 行 機 能 Copyright YusukeAndo. 2007. All rights reserved. 14
CakePHPが 提 供 するクエリ 実 行 機 能 Modelを 通 じて 下 記 の 処 理 が 可 能 対 象 テーブル 主 キーの 指 定 データ 構 造 を 元 にした 登 録 更 新 クエリの 自 動 実 行 条 件 を 元 にした 検 索 クエリの 自 動 実 行 任 意 のSQLの 実 行 scafoldを 利 用 する 場 合 などは 上 記 の 機 能 を 意 識 する 必 要 は ないが コードの 実 装 を 行 う 場 合 は 非 常 に 有 用 な 機 能 都 合 が 悪 い 場 合 はSQLの 任 意 実 行 する 従 来 の 方 法 も 可 能 Copyright YusukeAndo. 2007. All rights reserved. 15
対 象 テーブル 主 キーの 指 定 モデル 名 を 元 に 自 動 でテーブルを 決 定 例 )モデル 名 :Book 対 象 テーブル:books idという 名 称 のカラムを 主 キーとして 認 識 上 記 のルール 外 のテーブル 主 キーを 指 定 したい 場 合 は モデルのプロパティに 設 定 を 行 う 対 象 テーブルにNULLを 指 定 する 事 でDBを 使 用 しないモ デルとする 事 も 可 能 既 存 のスキーマやルールの 上 でCakeを 使 う 場 合 の 必 須 知 識 Copyright YusukeAndo. 2007. All rights reserved. 16
対 象 テーブル 主 キーの 指 定 例 app/models/user.php classuserextendsappmodel{ var$name= User'; var$usetable= user_account ; var$primarykey= login_id ; 使 用 するテーブル 名 主 キーのカラム 名 var$validate=aray( 'login_id'=>'/^[a-za-z0-9]*$/', 'password'=>'/^[a-za-z0-9]*$/', 'name'=>valid_not_empty, ); 暗 黙 的 なルールに 従 うよりも 把 握 しやすい 場 合 も Copyright YusukeAndo. 2007. All rights reserved. 17
登 録 更 新 クエリの 自 動 実 行 配 列 化 したパラメータを 元 に 自 動 でクエリを 実 行 idという 名 称 のカラムを 主 キーとして 認 識 主 キーを 指 定 し 該 当 レコードが 存 在 すれば 更 新 単 一 カラムの 更 新 であれば 直 接 指 定 も 可 能 INSERT UPDATEなどのSQLを 整 形 する 必 要 が 無 くなる Copyright YusukeAndo. 2007. All rights reserved. 18
登 録 更 新 クエリの 自 動 実 行 例 ( 配 列 版 ) app/controlers/memos_controler.php classmemoscontrolerextendsappcontroler{ functionhoge(){ $data['memo']=aray( ); 'kind_cd'=>'2', 'user_id'=>'2', 'contents'=>'モデルから 登 録 ' $this->memo->save($data); $this->flash('hoge','/memos/'); カラム 名 をキーにした ハッシュを 渡 す テスト 用 の 表 示 INSERT UPDATEなどのSQLを 整 形 する 必 要 が 無 くなる ( 渡 すデータに 存 在 する 主 キーの 指 定 を 含 めればUPDATE) Copyright YusukeAndo. 2007. All rights reserved. 19
登 録 更 新 クエリの 自 動 実 行 例 ( 配 列 版 ) SQLデバッグ 表 示 で 確 認 タイムスタンプなどは 自 動 で 補 完 して 実 行 Copyright YusukeAndo. 2007. All rights reserved. 20
更 新 クエリの 自 動 実 行 例 ( 単 一 カラム 版 ) app/controlers/memos_controler.php classmemoscontrolerextendsappcontroler{ functionhoge2(){ 対 象 のレコードを 指 定 $this->memo->id=4; $this->memo->savefield('contents',' 部 分 更 新 '); $this->flash('hoge2','/memos/'); モデルのプロパティに 対 象 レコードのIdを 指 定 する Copyright YusukeAndo. 2007. All rights reserved. 21
更 新 クエリの 自 動 実 行 例 ( 単 一 カラム 版 ) SQLデバッグ 表 示 で 確 認 ステータスの 更 新 などに 便 利 Copyright YusukeAndo. 2007. All rights reserved. 22
検 索 クエリの 自 動 実 行 配 列 化 したパラメータを 元 に 自 動 でクエリを 実 行 取 得 対 象 カラム ORDERLIMITなどが 指 定 可 能 自 力 で 構 築 したWHERE 句 の 指 定 も 可 能 マジックメソッドでの 検 索 も 可 能 findby{カラム 名 全 ての 引 数 には 初 期 値 あり functionfindal($conditions=nul,$fields=nul, $order=nul,$limit=nul,$page=1,$recursive= nul) Copyright YusukeAndo. 2007. All rights reserved. 23
検 索 クエリの 自 動 実 行 (find findal) app/controlers/memos_controler.php classmemoscontrolerextendsappcontroler{ functionhoge3(){ 検 索 パラメータ $cond=aray( Memo.kind_cd => 2,//kind_cd= 2 に 展 開 される ); Memo.created => >=2007-01-01 //>=での 比 較 になる 今 回 は 条 件 のみ 指 定 $data=$this->memo->findal($cond); $this->flash('hoge3','/memos/'); Copyright YusukeAndo. 2007. All rights reserved. 24
検 索 クエリの 自 動 実 行 SQLデバッグ 表 示 で 確 認 =の 比 較 >=の 比 較 パラメータを 元 にWHERE 句 を 生 成 して 実 行 Copyright YusukeAndo. 2007. All rights reserved. 25
検 索 クエリの 自 動 実 行 (OR 検 索 ) app/controlers/memos_controler.php classmemoscontrolerextendsappcontroler{ functionhoge4(){ $cond['or']=aray( 'Memo.kind_cd'=>'2', 'Memo.created'=>'>=2007-01-01' ); $data=$this->memo->findal($cond); $this->flash('hoge4','/memos/'); Copyright YusukeAndo. 2007. All rights reserved. 26
検 索 クエリの 自 動 実 行 (OR 検 索 ) SQLデバッグ 表 示 で 確 認 OR 検 索 も 可 能 (INLIKEも 可 能 ) Copyright YusukeAndo. 2007. All rights reserved. 27
検 索 時 の 注 意 点 比 較 演 算 子 の 指 定 方 法 はどうすれば? 値 の 前 に 演 算 子 を 置 き スペースを 空 ける 省 略 時 は =として 比 較 する 句 を 生 成 値 が 配 列 の 場 合 は IN(n,n,n)に 展 開 入 力 値 を 値 に 使 う 場 合 は =であっても 明 示 的 に 指 定 す る 演 算 子 をインジェクションされないように 注 意 Copyright YusukeAndo. 2007. All rights reserved. 28
入 力 値 との 組 み 合 わせ 例 app/controlers/memos_controler.php classmemoscontrolerextendsappcontroler{ functionmoge(){ $param=$this->data['memo']['kind_cd']; $cond=aray( 'kind_cd'=>'= '.$param ); $this->memo->findal($cond); 入 力 値 に 比 較 演 算 子 などが 入 るので=での 比 較 を 指 定 Copyright YusukeAndo. 2007. All rights reserved. 29
入 力 値 との 組 み 合 わせ 例 SQLデバッグ 表 示 で 確 認 値 として 処 理 危 険 な 入 力 値 が 入 っても 適 切 に 処 理 されている Copyright YusukeAndo. 2007. All rights reserved. 30
任 意 のSQLの 実 行 app/controlers/memos_controler.php classmemoscontrolerextendsappcontroler{ functionhoge5(){ $sql= SELECT*FROMmemos ; $data=$this->memo->query($sql); $this->flash('hoge5','/memos/'); functionhoge6(){ $cond="kind_cd>4"; $order="iddesc"; $data=$this->memo->findal($cond,null,$order); $this->flash('hoge6','/memos/'); Copyright YusukeAndo. 2007. All rights reserved. 31
validation Copyright YusukeAndo. 2007. All rights reserved. 32
validation 機 能 validation 機 能 の 概 要 Model 内 に 各 カラムの 制 限 値 を 正 規 表 現 で 設 定 save()メソッド 実 行 時 に 自 動 で 検 査 し 通 過 時 のみデータを 登 録 する validatesメソッドで 任 意 に 実 行 も 可 能 独 自 の 検 証 ロジックが 必 要 な 際 はModelのvalidatesをオー バーライドして 実 装 する エラーの 状 況 を 画 面 出 力 などに 必 要 な 場 合 は validateerorsメソッドを 利 用 scafoldではこれらの 機 能 がフル 活 用 されている Copyright YusukeAndo. 2007. All rights reserved. 33
Validation 設 定 例 app/models/user.php classuserextendsappmodel{ var$name= User'; var$usetable= user_account ; var$primarykey= login_id ; var$validate=aray( 'login_id'=>'/^[a-za-z0-9]*$/', 'password'=>'/^[a-za-z0-9]*$/', 各 カラムへの 設 定 ); 'name'=>valid_not_empty, 空 欄 数 値 メールなどについては 定 数 が 利 用 可 能 Copyright YusukeAndo. 2007. All rights reserved. 34
Validation 設 定 例 app/controlers/users_controler.php <?php classuserscontrolerextendsappcontroler{ functionfuga(){ $data['user']=aray( 'login_id'=>'+*+*+*+*', 'password'=>'abcde', 'name'=> ' ); if($this->user->validates($data)){ $this->user->save($data); else{ $this->validateerors($this->user); 不 正 を 含 むデータ 適 合 していれば 保 存 エラー 項 目 の 取 得 Copyright YusukeAndo. 2007. All rights reserved. 35
Validation 設 定 例 app/views/users/fuga.thtml <?phpecho$html->tagerormsg('user/login_id','ログインidが 正 しくありません ')?> <?phpecho$html->tagerormsg('user/password','パスワードが 正 しくありません ')?> <?phpecho$html->tagerormsg('user/name',' 名 前 が 正 しくありません ')?> tagerormsgで 該 当 モデルの 該 当 項 目 にエラーがあった 場 合 の 表 示 を 定 義 可 能 Copyright YusukeAndo. 2007. All rights reserved. 36
Validation 設 定 例 SQLは 実 行 されず エラー 項 目 がViewへ 通 知 されている Copyright YusukeAndo. 2007. All rights reserved. 37
アソシエーション Copyright YusukeAndo. 2007. All rights reserved. 38
アソシエーション 機 能 Model 内 で 従 属 関 係 を 指 定 する belongsto hasmany hasonehasandbelongstomanyな どを 指 定 可 能 外 部 キーが 命 名 規 則 に 当 てはまらない 場 合 はキー 名 も 併 せ て 指 定 する 上 記 の 設 定 がなされていればfindAlなどの 際 に 従 属 テーブ ルをJOINするSQLが 実 行 される findalなどのrecursive 引 数 により 関 連 レコードの 取 得 深 度 を 設 定 可 基 本 的 にModelに 対 して 設 定 をするだけでOK Copyright YusukeAndo. 2007. All rights reserved. 39
アソシエーション 設 定 の 例 app/models/memo.php classmemoextendsappmodel{ var$name='memo'; var$usedbconfig= test ; //var$belongsto=aray('user'); var$belongsto=aray('user'=> aray('classname'=>'user', 'conditions'=> ', 'order'=> ', リレーション 簡 易 設 定 リレーション 設 定 ( 冗 長 な 記 述 ) 'foreignkey'=>'user_id' )); 冗 長 な 設 定 をする 場 合 はbake.phpなどを 利 用 すると 良 い Copyright YusukeAndo. 2007. All rights reserved. 40
検 索 クエリの 自 動 実 行 (アソシエーション 時 ) Copyright YusukeAndo. 2007. All rights reserved. 41
まとめ Modelの 機 能 を 活 用 する 事 でDB 処 理 を 大 幅 にカット 可 能 汎 用 性 に 配 慮 した 実 装 になっている 状 況 次 第 で 従 来 どおりのクエリ 処 理 を 記 述 してもOK アソシエーションなどの 設 定 はツールを 活 用 した 方 が 良 い 実 感 としてはかなり 楽 です (クエリの 整 形 とか) 利 用 のインターフェースが 複 数 用 意 されているので 違 和 感 のない 利 用 方 法 が 見 つけられると 思 います Copyright YusukeAndo. 2007. All rights reserved. 42
謝 辞 参 考 サイト CakePHPのおいしい 食 べ 方 htp://cakephp.seesaa.net/ Copyright YusukeAndo. 2007. All rights reserved. 43
質 疑 応 答 ご 静 聴 ありがとうございました Copyright YusukeAndo. 2007. All rights reserved. 44