Contenu connexe Similaire à 20091030cakephphandson 02 Similaire à 20091030cakephphandson 02 (20) 20091030cakephphandson 022. アジェンダ
Modelの活用
データソース抽象化レイヤ機能
クエリ実行機能
アソシエーション
Helperの活用
代表的なヘルパー
ヘルパーの自作
AJAXヘルパーの利用
Copyright © YusukeAndo. 2009. All rights reserved. 2
4. データソースの抽象化
さまざまなデータベースを設定だけで利用可能
CakePHPは app/config/database.php 内の
設定により様々なデータベースを利用可能
Datasourceドライバを自作すればデータベース
以外からデータを取得するModelも作成可能
CSV
Twitter
Google API
データベースへの接続もこの一種
複数のデータソースの併用も可能
Copyright © YusukeAndo. 2009. All rights reserved. 4
5. データベース設定の記述例
app/config/database.php
class DATABASE_CONFIG
{
※利用するドライバ
var $default = array('driver' => 'mysql',
'connect' => 'mysql_connect', 永続接続など
'host' => 'localhost',
'login' => 'dbuser', 接続先設定
'password' => 'hoge',
'database' => 'beefcurry',
'prefix' => ''); テーブル名の接頭語
var $test = array('driver' => 'mysql',
'connect' => 'mysql_connect',.... 複数の設定を記述可
}
※ PEARを利用する場合は pear-mysql のように記述
Copyright © YusukeAndo. 2009. All rights reserved. 5
6. Modelが使用するデータソースの指定
app/models/memo.php (モデル毎に指定する場合)
class Memo extends AppModel {
var $name = 'Memo';
var $belongsTo = array('User');
使用する設定の名称
var $useDbConfig = „test‟;
}
app/app_model.php (アプリ全体に適用する場合)
class AppModel extends Model{
function __construct() {
$this->useDbConfig = "test";
parent::__construct();
}
}
Copyright © YusukeAndo. 2009. All rights reserved. 6
7. モデルの誤ったイメージ
Hoge
Fuga
データベース
Muga
Copyright © YusukeAndo. 2009. All rights reserved. 7
8. モデルの実際のイメージ
Hoge データベース
Fuga WEBAPI
Muga
どこにも接続しな
いモデルも可
Copyright © YusukeAndo. 2009. All rights reserved. 8
9. データソースの意味
CakePHPのModelはデータベースのテーブルに
通信するとは限らない
データベース以外との通信を行う事や組み合わ
せなども自在
複数のデータベースを併用するような事や、テー
ブルと異なる単位のModelの作成などは朝飯前
→主要なデータベースをカバーし、PEAR、ADOdb等も利用可能
Copyright © YusukeAndo. 2009. All rights reserved. 9
12. 対象テーブル・主キーの指定
モデル名を元に自動でテーブルを決定
例) モデル名:Book 対象テーブル:books
idという名称のカラムを主キーとして認識
上記のルール外のテーブル、主キーを指定した
い場合はモデルのプロパティに設定を行う
対象テーブルにNULLを指定する事でDBを使用
しないモデルとする事も可能
Copyright © YusukeAndo. 2009. All rights reserved. 12
14. 登録・更新クエリの自動実行
パラメータを元に自動でクエリを実行
主キーを指定し、該当レコードが存在すれば
UPDATE
主キーを指定しない場合は常にINSERT
単一カラムの更新であれば直接指定も可能
データ型式はモデル名とカラム名をキーにしたハ
ッシュを利用する(フォームと同じ)
SQLを整形する退屈なプログラムを
書くのを止めよう
Copyright © YusukeAndo. 2009. All rights reserved. 14
15. Controllerへのアクションの修正
<?php
class PostsController extends AppController {
function add() {
if (!empty($this->data)) {
$this->data[‘Post’][‘user_id’] = 1; //明示的にデータを指定
if ($this->Post->save($this->data)) {
$this->flash('Your post has been saved.','/posts');
}
}
}
}
フォームからのデータでも通常のデータでも保存可能
15
16. 自動で行われる挙動が問題になった時
自動で新規登録・更新が変わってしまうのが困
る場合はidにnullをセットすれば必ず新規登録
フォームを汚染されて更新してはいけないカラム
が更新される事を防ぐにはオプションを指定
複数のレコードを新規登録する時はcreateを呼
ぶか、idにnullをセットしなおす
ちょっとした工夫で挙動を制限できます
Copyright © YusukeAndo. 2009. All rights reserved. 16
17. 実習 2-1
つぶやき登録の修正
controllers/posts_controller.php を修正
user_idを自由入力させないようにする
Copyright © YusukeAndo. 2009. All rights reserved. 17
18. 検索クエリの自動実行
配列化したパラメータを元にクエリを実行
取得対象カラム、ORDER LIMITなどが指定可能
自力で構築したWHERE句の指定も可能
マジックメソッドでの検索も可能
findBy{カラム名}
全ての引数には初期値あり
function find($type, $params)
Copyright © YusukeAndo. 2009. All rights reserved. 18
19. findのタイプ
all 全件取得
first 最初の1件を取得
count 件数を取得
list リスト構造のデータを取得
threaded スレッド型式のデータを取得
neighbors 隣り合うデータを取得
圧倒的にallの使用頻度が高い!
Copyright © YusukeAndo. 2009. All rights reserved. 19
20. findのパラメータ
conditions 各カラムへの条件を指定
recursive 関連データの取得の有無
fields 取得するフィールド
order 並び替え指定
group グルーピング指定
limit データ取得件数
page ページ番号
callbacks コールバックを実行するか
Copyright © YusukeAndo. 2009. All rights reserved. 20
21. 検索クエリの自動実行
function hoge() {
$params = array(
'conditions' => array(
‘Post.user_id’ => ‘1’, //user_id = 1
‘Post.created >=’ => ‘2009-10-10‘ //演算子
)
);
$posts = $this->Post->find('all',$params);
}
Copyright © YusukeAndo. 2009. All rights reserved. 21
22. 検索クエリの自動実行
SQLデバッグ表示で確認
= の比較
>= の比較
→パラメータを元にWHERE句を生成して実行
Copyright © YusukeAndo. 2009. All rights reserved. 22
24. 検索クエリの自動実行 (OR検索)
function hoge() {
$params = array(
'conditions' => array(
‘OR’ => array(
‘Post.user_id’ => ‘1’, //user_id = 1
‘Post.created >=’ => ‘2009-10-10‘
)
)
);
$posts = $this->Post->find('all',$params);
}
Copyright © YusukeAndo. 2009. All rights reserved. 24
26. 任意のSQLの実行
function hoge(){
$sql = “SELECT * FROM memos as Memo”;
$data = $this->Memo->query($sql);
}
一連のfindの挙動とはほぼ無関係
• 自由にSQLを記述
• データを取得する際は as を指定するとベター
• 結果は配列で取得
Copyright © YusukeAndo. 2009. All rights reserved. 26
28. find count の実行例
function index(){
$post_data = $this->paginate('Post');
$param = array(
'conditions' => aa('Post.user_id',1),
);
$my_count = $this->Post->find('count',$param);
$all_count = $this->Post->find('count');
$this->set('my_count',$my_count);
$this->set('all_count',$all_count);
$this->set('post_data',$post_data);
$this->render('index');
}
Copyright © YusukeAndo. 2009. All rights reserved. 28
29. 実習 2-2
つぶやき表示の修正
controllers/posts_controller.php を修正
あなたのつぶやき、みんなのつぶやきの件数を取得
find count を使う
件数をViewにSet
Layout内の数値を変数に置き換える
Copyright © YusukeAndo. 2009. All rights reserved. 29
33. アソシエーション機能
Model内で従属関係を指定する。
belongsTo hasMany hasOne
hasAndBelongsToMany などを指定可能
外部キーが命名規則に当てはまらない場合はキー
名も併せて指定する
上記の設定がなされていればfindなどの際に従属
テーブルをJOINするSQLが実行される。
findなどのrecursive引数により関連レコードの取得
深度を設定可
→基本的にModelに対して設定をするだけでOK
Copyright © YusukeAndo. 2009. All rights reserved. 33
34. アソシエーションの種類
belongsTo
一件のデータに従属する 日記→作成者
hasMany
複数のデータを所有する 作成者→日記
hasOne
一件のデータを所有する ユーザ→プロフィール
hasAndBelongsToMany
データ間を関連付ける中間テーブルなど
ブログ ← 関連付け → タグ
→基本的にModelに対して設定をするだけでOK
Copyright © YusukeAndo. 2009. All rights reserved. 34
35. アソシエーション設定の例
class Post extends AppModel { リレーション簡
//var $belongsTo = array('User'); 易設定
var $belongsTo = array('User' =>
array('className' => 'User',
'conditions' => '',
'order' => '',
'foreignKey' => 'user_id'
));
} リレーション設定
(冗長な記述)
Copyright © YusukeAndo. 2009. All rights reserved. 35
38. 実習 2-3
関連付けの設定
Models/post/php に設定を追加
views/posts/index.ctpを修正
それっぽい表示を確認
Copyright © YusukeAndo. 2009. All rights reserved. 38
39. まとめ
Modelの機能を活用する事でDB処理を大幅にカット可能
汎用性に配慮した実装になっている
状況次第で従来どおりのクエリ処理を記述してもOK
アソシエーションなどの設定はツールを活用した方が良い
実感としてはかなり楽です。(クエリの整形とか)
利用のインターフェースが複数用意されているので、違和
感のない利用方法が見つけられると思います。
Copyright © YusukeAndo. 2009. All rights reserved. 39
41. 代表的なヘルパー
HtmlHelper
FormHelper
JavaScriptHelper
PaginatorHelper
RssHelper
→基本的にModelに対して設定をするだけでOK
Copyright © YusukeAndo. 2009. All rights reserved. 41
43. ヘルパーを自作する時
独自のルールでURLを作成する
ex) ユーザーIDを元にユーザーページへリンクする
さまざまな条件に従って画像を表示する
ex) 数値に応じて表示するアイコンを3段階に変更
文字列やデータを独自のフォーマットで変形したい
ex) dateなどで対応できないようなフォーマット
Viewをifや処理で汚さない為の手段
→基本的にModelに対して設定をするだけでOK
Copyright © YusukeAndo. 2009. All rights reserved. 43
44. ヘルパーを自作する手順
app/views/helpers にクラスを作成
Controller内のhelpersに指定
自作したHelper内で別のHelperも呼び出せる
例としてgravatarの呼出などがhelperに適している
Gravatarはメールアドレスをmd5する事でアイコ
ン画像を呼び出せるサービス
Copyright © YusukeAndo. 2009. All rights reserved. 44
45. Gravatarを表示するヘルパー
<?php
class GravatarHelper extends AppHelper {
var $helpers = array('Html');
function image($mail){
return $this->Html->image(
'http://www.gravatar.com/avatar/'.
md5($mail).
'?s=40&r=G');
}
}
Copyright © YusukeAndo. 2009. All rights reserved. 45
46. 自作したヘルパーを設定
<?php
class PostsController extends AppController {
var $name = 'Posts';
var $helpers = array('Gravatar');
//var $scaffold;
var $paginate = array(
'order' => array('Post.id' => 'DESC'),
'limit' => 10
);
}
Copyright © YusukeAndo. 2009. All rights reserved. 46
47. 自作のGravatarヘルパーを組み込んだ例
<?php foreach ($post_data as $row): ?>
<tr>
<td class="friendicon">
<?php //echo $html-
>image('http://www.gravatar.com/avatar/'.md5($row['U
ser']['mail']).'?s=40&r=G') ?>
<?php echo $gravatar->image($row['User']['mail']) ?>
</td>
</tr>
<?php endforeach; ?>
ヘルパー化によってシンプルに
Copyright © YusukeAndo. 2009. All rights reserved. 47
49. 実習 2-4
Gravatarの利用
views/helpers/gravatar.php を作成
controllers/posts_contrller.phpに設定追加
views/posts/index.ctpを修正
アイコンが表示されればOK
Copyright © YusukeAndo. 2009. All rights reserved. 49
51. AJAXヘルパーとは?
JavaScriptを書かずにAJAX的な動きを提供する
画面の書き換えにはdivタグのidなどを利用
AJAXから送信したデータをコントローラで扱える
prototype.js と scriptaculousを利用
→基本的にModelに対して設定をするだけでOK
Copyright © YusukeAndo. 2009. All rights reserved. 51
52. AJAXヘルパーを使う
ライブラリをダウンロードしてjsフォルダにコピー
Scriptaculousのサイトからダウンロードできます
AjaxヘルパーとJavascriptヘルパーを設定
Prototypeとscriptaculousをロード
RequestHandlerコンポーネントも便利
→基本的にModelに対して設定をするだけでOK
Copyright © YusukeAndo. 2009. All rights reserved. 52
53. 実習 2-5
つぶやき登録のAJAX化
controllers/posts_controller.phpを修正
views/posts/index.ctpを修正
それっぽい表示を確認
Copyright © YusukeAndo. 2009. All rights reserved. 53
56. 質疑応答
ご静聴ありがとうございました。
Copyright © YusukeAndo. 2009. All rights reserved. 56