SlideShare une entreprise Scribd logo
1  sur  56
Télécharger pour lire hors ligne
CakeMatsuriワークショップ
  Model&Helper活用講座


               2009/10/30 yandod   1
                                       1
アジェンダ


   Modelの活用
     データソース抽象化レイヤ機能
     クエリ実行機能
     アソシエーション
   Helperの活用
      代表的なヘルパー
      ヘルパーの自作
      AJAXヘルパーの利用


Copyright © YusukeAndo. 2009. All rights reserved.   2
データソース抽象化
データソースの抽象化
   さまざまなデータベースを設定だけで利用可能
   CakePHPは app/config/database.php 内の
   設定により様々なデータベースを利用可能
   Datasourceドライバを自作すればデータベース
   以外からデータを取得するModelも作成可能
      CSV
      Twitter
      Google API
      データベースへの接続もこの一種
   複数のデータソースの併用も可能
Copyright © YusukeAndo. 2009. All rights reserved.   4
データベース設定の記述例
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
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
モデルの誤ったイメージ



                   Hoge


                    Fuga
                                                     データベース

                   Muga




Copyright © YusukeAndo. 2009. All rights reserved.            7
モデルの実際のイメージ



      Hoge                                           データベース


      Fuga                                            WEBAPI


     Muga
                                                     どこにも接続しな
                                                     いモデルも可


Copyright © YusukeAndo. 2009. All rights reserved.              8
データソースの意味
   CakePHPのModelはデータベースのテーブルに
   通信するとは限らない
   データベース以外との通信を行う事や組み合わ
   せなども自在
   複数のデータベースを併用するような事や、テー
   ブルと異なる単位のModelの作成などは朝飯前




→主要なデータベースをカバーし、PEAR、ADOdb等も利用可能
Copyright © YusukeAndo. 2009. All rights reserved.   9
クエリ実行機能
CakePHPが提供するクエリ実行機能
Modelを通じて下記の処理が可能
• 対象テーブル・主キーの指定
• データ構造を元にした更新クエリの自動実行
• 条件を元にした検索クエリの自動実行
• 任意のSQLの実行


       CakePHPの代表的な機能

Copyright © YusukeAndo. 2009. All rights reserved.   11
対象テーブル・主キーの指定
   モデル名を元に自動でテーブルを決定
    例) モデル名:Book 対象テーブル:books
   idという名称のカラムを主キーとして認識
   上記のルール外のテーブル、主キーを指定した
   い場合はモデルのプロパティに設定を行う
   対象テーブルにNULLを指定する事でDBを使用
   しないモデルとする事も可能




Copyright © YusukeAndo. 2009. All rights reserved.   12
対象テーブル・主キーの指定例
app/models/user.php
class User extends AppModel {
   var $name = „User';             使用するテーブル名
   var $useTable = „user_account‟;
   var $primaryKey = „login_id‟;    主キーのカラム名
}




命名規則は必須ではなくあくまで「デフォルト」

Copyright © YusukeAndo. 2009. All rights reserved.   13
登録・更新クエリの自動実行
   パラメータを元に自動でクエリを実行
   主キーを指定し、該当レコードが存在すれば
   UPDATE
   主キーを指定しない場合は常にINSERT
   単一カラムの更新であれば直接指定も可能
   データ型式はモデル名とカラム名をキーにしたハ
   ッシュを利用する(フォームと同じ)

            SQLを整形する退屈なプログラムを
                 書くのを止めよう
Copyright © YusukeAndo. 2009. All rights reserved.   14
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
自動で行われる挙動が問題になった時
   自動で新規登録・更新が変わってしまうのが困
   る場合はidにnullをセットすれば必ず新規登録
   フォームを汚染されて更新してはいけないカラム
   が更新される事を防ぐにはオプションを指定
   複数のレコードを新規登録する時はcreateを呼
   ぶか、idにnullをセットしなおす



       ちょっとした工夫で挙動を制限できます

Copyright © YusukeAndo. 2009. All rights reserved.   16
実習 2-1



               つぶやき登録の修正

controllers/posts_controller.php を修正
user_idを自由入力させないようにする




Copyright © YusukeAndo. 2009. All rights reserved.   17
検索クエリの自動実行
   配列化したパラメータを元にクエリを実行
   取得対象カラム、ORDER LIMITなどが指定可能
   自力で構築したWHERE句の指定も可能
   マジックメソッドでの検索も可能
    findBy{カラム名}
   全ての引数には初期値あり

function find($type, $params)


Copyright © YusukeAndo. 2009. All rights reserved.   18
findのタイプ
   all                                全件取得
   first                              最初の1件を取得
   count                              件数を取得
   list                               リスト構造のデータを取得
   threaded                           スレッド型式のデータを取得
   neighbors                          隣り合うデータを取得

        圧倒的にallの使用頻度が高い!

Copyright © YusukeAndo. 2009. All rights reserved.    19
findのパラメータ
   conditions                         各カラムへの条件を指定
   recursive                          関連データの取得の有無
   fields                             取得するフィールド
   order                              並び替え指定
   group                              グルーピング指定
   limit                              データ取得件数
   page                               ページ番号
   callbacks                          コールバックを実行するか

Copyright © YusukeAndo. 2009. All rights reserved.   20
検索クエリの自動実行
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
検索クエリの自動実行
SQLデバッグ表示で確認
                                                     = の比較




                                                      >= の比較
→パラメータを元にWHERE句を生成して実行

Copyright © YusukeAndo. 2009. All rights reserved.             22
検索時の注意点
比較演算子の指定方法はどうすれば?
• カラム名の後に演算子を置く
• 省略時は = として比較する句を生成
• 値が配列の場合は IN (n,n,n) に展開




→演算子をインジェクションされないように注意。

Copyright © YusukeAndo. 2009. All rights reserved.   23
検索クエリの自動実行 (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
検索クエリの自動実行(OR検索)
SQLデバッグ表示で確認




→OR ANDなどを配列の階層で表現可能

Copyright © YusukeAndo. 2009. All rights reserved.   25
任意のSQLの実行

function hoge(){
   $sql = “SELECT * FROM memos as Memo”;
   $data = $this->Memo->query($sql);
}

一連のfindの挙動とはほぼ無関係
• 自由にSQLを記述
• データを取得する際は as を指定するとベター
• 結果は配列で取得

 Copyright © YusukeAndo. 2009. All rights reserved.   26
クエリの直接実行
SQLデバッグ表示で確認




Copyright © YusukeAndo. 2009. All rights reserved.   27
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
実習 2-2



               つぶやき表示の修正

controllers/posts_controller.php を修正
あなたのつぶやき、みんなのつぶやきの件数を取得
     find count を使う
     件数をViewにSet
     Layout内の数値を変数に置き換える
Copyright © YusukeAndo. 2009. All rights reserved.   29
バリデーション
validation機能
validation機能の概要
• Model内に各カラムの制限値を配列で設定
• save()メソッド実行時に自動で検査し通過時のみデータを
  登録する。
• validatesメソッドで任意に実行も可能。
• 独自の検証ロジックが必要な際はModelのvalidatesをオー
  バーライドして実装する。



→scaffoldではこれらの機能がフル活用されている。

Copyright © YusukeAndo. 2009. All rights reserved.   31
アソシエーション
アソシエーション機能
   Model内で従属関係を指定する。
   belongsTo hasMany hasOne
   hasAndBelongsToMany などを指定可能
   外部キーが命名規則に当てはまらない場合はキー
   名も併せて指定する
   上記の設定がなされていればfindなどの際に従属
   テーブルをJOINするSQLが実行される。
   findなどのrecursive引数により関連レコードの取得
   深度を設定可

→基本的にModelに対して設定をするだけでOK
Copyright © YusukeAndo. 2009. All rights reserved.   33
アソシエーションの種類
   belongsTo
   一件のデータに従属する 日記→作成者
   hasMany
   複数のデータを所有する                                       作成者→日記
   hasOne
   一件のデータを所有する                                       ユーザ→プロフィール
   hasAndBelongsToMany
   データ間を関連付ける中間テーブルなど
                   ブログ ← 関連付け → タグ

→基本的にModelに対して設定をするだけでOK
Copyright © YusukeAndo. 2009. All rights reserved.                34
アソシエーション設定の例
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
自動的に関連データを取得




Copyright © YusukeAndo. 2009. All rights reserved.   36
関連データの内容を表示




Copyright © YusukeAndo. 2009. All rights reserved.   37
実習 2-3



                       関連付けの設定

Models/post/php に設定を追加
views/posts/index.ctpを修正
それっぽい表示を確認



Copyright © YusukeAndo. 2009. All rights reserved.   38
まとめ

  Modelの機能を活用する事でDB処理を大幅にカット可能
  汎用性に配慮した実装になっている
  状況次第で従来どおりのクエリ処理を記述してもOK
  アソシエーションなどの設定はツールを活用した方が良い
  実感としてはかなり楽です。(クエリの整形とか)
  利用のインターフェースが複数用意されているので、違和
  感のない利用方法が見つけられると思います。




Copyright © YusukeAndo. 2009. All rights reserved.   39
代表的なヘルパー
代表的なヘルパー
   HtmlHelper
   FormHelper
   JavaScriptHelper
   PaginatorHelper
   RssHelper




→基本的にModelに対して設定をするだけでOK
Copyright © YusukeAndo. 2009. All rights reserved.   41
ヘルパーの自作
ヘルパーを自作する時
   独自のルールでURLを作成する
   ex) ユーザーIDを元にユーザーページへリンクする
   さまざまな条件に従って画像を表示する
   ex) 数値に応じて表示するアイコンを3段階に変更
   文字列やデータを独自のフォーマットで変形したい
   ex) dateなどで対応できないようなフォーマット



    Viewをifや処理で汚さない為の手段
→基本的にModelに対して設定をするだけでOK
Copyright © YusukeAndo. 2009. All rights reserved.   43
ヘルパーを自作する手順
   app/views/helpers にクラスを作成
   Controller内のhelpersに指定
   自作したHelper内で別のHelperも呼び出せる
   例としてgravatarの呼出などがhelperに適している
    Gravatarはメールアドレスをmd5する事でアイコ
    ン画像を呼び出せるサービス




Copyright © YusukeAndo. 2009. All rights reserved.   44
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
自作したヘルパーを設定
<?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
自作の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
Gravatarを表示




Copyright © YusukeAndo. 2009. All rights reserved.   48
実習 2-4



                        Gravatarの利用

views/helpers/gravatar.php を作成
controllers/posts_contrller.phpに設定追加
views/posts/index.ctpを修正
アイコンが表示されればOK


Copyright © YusukeAndo. 2009. All rights reserved.   49
AJAXヘルパーの利用
AJAXヘルパーとは?
   JavaScriptを書かずにAJAX的な動きを提供する
   画面の書き換えにはdivタグのidなどを利用
   AJAXから送信したデータをコントローラで扱える
   prototype.js と scriptaculousを利用




→基本的にModelに対して設定をするだけでOK
Copyright © YusukeAndo. 2009. All rights reserved.   51
AJAXヘルパーを使う
   ライブラリをダウンロードしてjsフォルダにコピー
     Scriptaculousのサイトからダウンロードできます
   AjaxヘルパーとJavascriptヘルパーを設定
   Prototypeとscriptaculousをロード
   RequestHandlerコンポーネントも便利




→基本的にModelに対して設定をするだけでOK
Copyright © YusukeAndo. 2009. All rights reserved.   52
実習 2-5



          つぶやき登録のAJAX化

controllers/posts_controller.phpを修正
views/posts/index.ctpを修正
それっぽい表示を確認



Copyright © YusukeAndo. 2009. All rights reserved.   53
まとめ



Copyright © YusukeAndo. 2009. All rights reserved.   54
まとめ

CakePHPはとても簡単なMVCフレームワーク
さまざまな機能を活用することでコード量を大きく減ら
す事ができる
必要な情報はマニュアル・API・ネットからゲットする
‚Give back as much as you take‛
ブログに書く、誰かに教えてあげるなど自分が得た以
上のものを誰かに与えてあげましょう



Copyright © YusukeAndo. 2009. All rights reserved.   55
質疑応答




                 ご静聴ありがとうございました。




Copyright © YusukeAndo. 2009. All rights reserved.   56

Contenu connexe

Tendances

Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門だいすけ さとう
 
Powershell勉強会 v3 (もっと新しいバージョンがあります)
Powershell勉強会 v3 (もっと新しいバージョンがあります)Powershell勉強会 v3 (もっと新しいバージョンがあります)
Powershell勉強会 v3 (もっと新しいバージョンがあります)Tetsu Yama
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2Atsuo Yamasaki
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?kwatch
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門kwatch
 
traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話infinite_loop
 
Array twitter2
Array twitter2Array twitter2
Array twitter2Jun Chiba
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 Nobuaki Oshiro
 
Tour of distributed systems 1 - ZooKeeper
Tour of distributed systems 1 - ZooKeeperTour of distributed systems 1 - ZooKeeper
Tour of distributed systems 1 - ZooKeeperChris Birchall
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017Shigeru Hanada
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみようKentaro Matsui
 
これからのpre_get_postsの話をしよう
これからのpre_get_postsの話をしようこれからのpre_get_postsの話をしよう
これからのpre_get_postsの話をしようHishikawa Takuro
 
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaPostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaShigeru Hanada
 
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会Nao Minami
 
ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件Kazuki MATSUMOTO
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
System4 comment h
System4 comment hSystem4 comment h
System4 comment hJun Chiba
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
運用構築技術者の為のPSプログラミング第2回
運用構築技術者の為のPSプログラミング第2回運用構築技術者の為のPSプログラミング第2回
運用構築技術者の為のPSプログラミング第2回Shigeharu Yamaoka
 

Tendances (20)

Jubatus 1.0 の紹介
Jubatus 1.0 の紹介Jubatus 1.0 の紹介
Jubatus 1.0 の紹介
 
Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門
 
Powershell勉強会 v3 (もっと新しいバージョンがあります)
Powershell勉強会 v3 (もっと新しいバージョンがあります)Powershell勉強会 v3 (もっと新しいバージョンがあります)
Powershell勉強会 v3 (もっと新しいバージョンがあります)
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 
traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話
 
Array twitter2
Array twitter2Array twitter2
Array twitter2
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920
 
Tour of distributed systems 1 - ZooKeeper
Tour of distributed systems 1 - ZooKeeperTour of distributed systems 1 - ZooKeeper
Tour of distributed systems 1 - ZooKeeper
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
これからのpre_get_postsの話をしよう
これからのpre_get_postsの話をしようこれからのpre_get_postsの話をしよう
これからのpre_get_postsの話をしよう
 
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaPostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
 
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会
 
ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件ActiveResourceが面白すぎる件
ActiveResourceが面白すぎる件
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
System4 comment h
System4 comment hSystem4 comment h
System4 comment h
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
運用構築技術者の為のPSプログラミング第2回
運用構築技術者の為のPSプログラミング第2回運用構築技術者の為のPSプログラミング第2回
運用構築技術者の為のPSプログラミング第2回
 

En vedette

20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01Yusuke Ando
 
20090905 Cake Php
20090905 Cake Php20090905 Cake Php
20090905 Cake PhpYusuke Ando
 
Engine Yard Cloud
Engine Yard CloudEngine Yard Cloud
Engine Yard CloudYusuke Ando
 
20120507 zendform
20120507 zendform20120507 zendform
20120507 zendformYusuke Ando
 
Cake Php キャッシュのやり方
Cake Php キャッシュのやり方Cake Php キャッシュのやり方
Cake Php キャッシュのやり方柴田 篤志
 
【公式資料】第2回クラウド・マーケティング研究会オープニングセッション
【公式資料】第2回クラウド・マーケティング研究会オープニングセッション【公式資料】第2回クラウド・マーケティング研究会オープニングセッション
【公式資料】第2回クラウド・マーケティング研究会オープニングセッションShu Takeda
 
Apresentação mahara
Apresentação maharaApresentação mahara
Apresentação maharaPoetray
 

En vedette (8)

20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
20090905 Cake Php
20090905 Cake Php20090905 Cake Php
20090905 Cake Php
 
20121225 php
20121225 php20121225 php
20121225 php
 
Engine Yard Cloud
Engine Yard CloudEngine Yard Cloud
Engine Yard Cloud
 
20120507 zendform
20120507 zendform20120507 zendform
20120507 zendform
 
Cake Php キャッシュのやり方
Cake Php キャッシュのやり方Cake Php キャッシュのやり方
Cake Php キャッシュのやり方
 
【公式資料】第2回クラウド・マーケティング研究会オープニングセッション
【公式資料】第2回クラウド・マーケティング研究会オープニングセッション【公式資料】第2回クラウド・マーケティング研究会オープニングセッション
【公式資料】第2回クラウド・マーケティング研究会オープニングセッション
 
Apresentação mahara
Apresentação maharaApresentação mahara
Apresentação mahara
 

Similaire à 20091030cakephphandson 02

CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1kenjis
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoyakenjis
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門Sho A
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12kenjis
 
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥Insight Technology, Inc.
 
2019-09-20 JXUG Introduction to Xamarin.Essentials #2 Preferences
2019-09-20 JXUG Introduction to Xamarin.Essentials #2 Preferences2019-09-20 JXUG Introduction to Xamarin.Essentials #2 Preferences
2019-09-20 JXUG Introduction to Xamarin.Essentials #2 PreferencesTakeshi Fujimoto
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -Akio Katayama
 
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンAzure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンKazuyuki Miyake
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 
Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成Yu Nobuoka
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発Mitsuru Katoh
 
Azure Cosmos DB を使った クラウドネイティブアプリケーションの 設計パターン
Azure Cosmos DB を使った クラウドネイティブアプリケーションの 設計パターンAzure Cosmos DB を使った クラウドネイティブアプリケーションの 設計パターン
Azure Cosmos DB を使った クラウドネイティブアプリケーションの 設計パターンKazuyuki Miyake
 
2015 03-12 道玄坂LT祭り第2回 Spark DataFrame Introduction
2015 03-12 道玄坂LT祭り第2回 Spark DataFrame Introduction2015 03-12 道玄坂LT祭り第2回 Spark DataFrame Introduction
2015 03-12 道玄坂LT祭り第2回 Spark DataFrame IntroductionYu Ishikawa
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
ルールベースから機械学習への道 公開用
ルールベースから機械学習への道 公開用ルールベースから機械学習への道 公開用
ルールベースから機械学習への道 公開用nishio
 

Similaire à 20091030cakephphandson 02 (20)

Cakephp
CakephpCakephp
Cakephp
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 
PHPフレームワーク入門
PHPフレームワーク入門PHPフレームワーク入門
PHPフレームワーク入門
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
Lithium Labo #1
Lithium Labo #1Lithium Labo #1
Lithium Labo #1
 
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
 
2019-09-20 JXUG Introduction to Xamarin.Essentials #2 Preferences
2019-09-20 JXUG Introduction to Xamarin.Essentials #2 Preferences2019-09-20 JXUG Introduction to Xamarin.Essentials #2 Preferences
2019-09-20 JXUG Introduction to Xamarin.Essentials #2 Preferences
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
 
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンAzure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
 
Datomic&datalog紹介
Datomic&datalog紹介Datomic&datalog紹介
Datomic&datalog紹介
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発
 
Azure Cosmos DB を使った クラウドネイティブアプリケーションの 設計パターン
Azure Cosmos DB を使った クラウドネイティブアプリケーションの 設計パターンAzure Cosmos DB を使った クラウドネイティブアプリケーションの 設計パターン
Azure Cosmos DB を使った クラウドネイティブアプリケーションの 設計パターン
 
2015 03-12 道玄坂LT祭り第2回 Spark DataFrame Introduction
2015 03-12 道玄坂LT祭り第2回 Spark DataFrame Introduction2015 03-12 道玄坂LT祭り第2回 Spark DataFrame Introduction
2015 03-12 道玄坂LT祭り第2回 Spark DataFrame Introduction
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
ルールベースから機械学習への道 公開用
ルールベースから機械学習への道 公開用ルールベースから機械学習への道 公開用
ルールベースから機械学習への道 公開用
 

Plus de Yusuke Ando

ダイナミック広告の改善と拡大
ダイナミック広告の改善と拡大ダイナミック広告の改善と拡大
ダイナミック広告の改善と拡大Yusuke Ando
 
DevOpsを実現するChef活用テクニック
DevOpsを実現するChef活用テクニックDevOpsを実現するChef活用テクニック
DevOpsを実現するChef活用テクニックYusuke Ando
 
DevOpsを実現する為のChef実践テクニック Chef12対応版
DevOpsを実現する為のChef実践テクニック Chef12対応版DevOpsを実現する為のChef実践テクニック Chef12対応版
DevOpsを実現する為のChef実践テクニック Chef12対応版Yusuke Ando
 
Testing your app with Selenium on Travis CI
Testing your app with Selenium on Travis CITesting your app with Selenium on Travis CI
Testing your app with Selenium on Travis CIYusuke Ando
 
Travis CIで実現するPHPアプリの自動テスト
Travis CIで実現するPHPアプリの自動テストTravis CIで実現するPHPアプリの自動テスト
Travis CIで実現するPHPアプリの自動テストYusuke Ando
 
Shimokita.Unity Detonatorで爆発
Shimokita.Unity Detonatorで爆発Shimokita.Unity Detonatorで爆発
Shimokita.Unity Detonatorで爆発Yusuke Ando
 
Shimokita.Unity RigidbodyとColliderで衝突
Shimokita.Unity RigidbodyとColliderで衝突Shimokita.Unity RigidbodyとColliderで衝突
Shimokita.Unity RigidbodyとColliderで衝突Yusuke Ando
 
Webプログラマの為のUnity入門
Webプログラマの為のUnity入門Webプログラマの為のUnity入門
Webプログラマの為のUnity入門Yusuke Ando
 
ゴールデンウィークに最適な学習コンテンツ
ゴールデンウィークに最適な学習コンテンツゴールデンウィークに最適な学習コンテンツ
ゴールデンウィークに最適な学習コンテンツYusuke Ando
 
Travis CIですぐに始める継続的インテグレーション
Travis CIですぐに始める継続的インテグレーションTravis CIですぐに始める継続的インテグレーション
Travis CIですぐに始める継続的インテグレーションYusuke Ando
 
ブログやサイトのJekyllへの移行
ブログやサイトのJekyllへの移行ブログやサイトのJekyllへの移行
ブログやサイトのJekyllへの移行Yusuke Ando
 
PHPとTravis CIでブラウザテスト
PHPとTravis CIでブラウザテストPHPとTravis CIでブラウザテスト
PHPとTravis CIでブラウザテストYusuke Ando
 
Shimokita.Unity パリの街をユニティちゃんが駆ける
Shimokita.Unity パリの街をユニティちゃんが駆けるShimokita.Unity パリの街をユニティちゃんが駆ける
Shimokita.Unity パリの街をユニティちゃんが駆けるYusuke Ando
 
Engine Yardで作る NetCommons3のクラウド環境
Engine Yardで作る NetCommons3のクラウド環境Engine Yardで作る NetCommons3のクラウド環境
Engine Yardで作る NetCommons3のクラウド環境Yusuke Ando
 
最近のCandyCane - PHP版Redmineでタスク管理を始めよう
最近のCandyCane - PHP版Redmineでタスク管理を始めよう最近のCandyCane - PHP版Redmineでタスク管理を始めよう
最近のCandyCane - PHP版Redmineでタスク管理を始めようYusuke Ando
 
PHPの教室「foreachを極める」
PHPの教室「foreachを極める」PHPの教室「foreachを極める」
PHPの教室「foreachを極める」Yusuke Ando
 
90分間濃縮 PHPエラーの教室
90分間濃縮 PHPエラーの教室90分間濃縮 PHPエラーの教室
90分間濃縮 PHPエラーの教室Yusuke Ando
 

Plus de Yusuke Ando (20)

ダイナミック広告の改善と拡大
ダイナミック広告の改善と拡大ダイナミック広告の改善と拡大
ダイナミック広告の改善と拡大
 
DevOpsを実現するChef活用テクニック
DevOpsを実現するChef活用テクニックDevOpsを実現するChef活用テクニック
DevOpsを実現するChef活用テクニック
 
DevOpsを実現する為のChef実践テクニック Chef12対応版
DevOpsを実現する為のChef実践テクニック Chef12対応版DevOpsを実現する為のChef実践テクニック Chef12対応版
DevOpsを実現する為のChef実践テクニック Chef12対応版
 
Testing your app with Selenium on Travis CI
Testing your app with Selenium on Travis CITesting your app with Selenium on Travis CI
Testing your app with Selenium on Travis CI
 
Travis CIで実現するPHPアプリの自動テスト
Travis CIで実現するPHPアプリの自動テストTravis CIで実現するPHPアプリの自動テスト
Travis CIで実現するPHPアプリの自動テスト
 
Shimokita.Unity Detonatorで爆発
Shimokita.Unity Detonatorで爆発Shimokita.Unity Detonatorで爆発
Shimokita.Unity Detonatorで爆発
 
Shimokita.Unity RigidbodyとColliderで衝突
Shimokita.Unity RigidbodyとColliderで衝突Shimokita.Unity RigidbodyとColliderで衝突
Shimokita.Unity RigidbodyとColliderで衝突
 
Webプログラマの為のUnity入門
Webプログラマの為のUnity入門Webプログラマの為のUnity入門
Webプログラマの為のUnity入門
 
ゴールデンウィークに最適な学習コンテンツ
ゴールデンウィークに最適な学習コンテンツゴールデンウィークに最適な学習コンテンツ
ゴールデンウィークに最適な学習コンテンツ
 
Travis CIですぐに始める継続的インテグレーション
Travis CIですぐに始める継続的インテグレーションTravis CIですぐに始める継続的インテグレーション
Travis CIですぐに始める継続的インテグレーション
 
ブログやサイトのJekyllへの移行
ブログやサイトのJekyllへの移行ブログやサイトのJekyllへの移行
ブログやサイトのJekyllへの移行
 
PHPとTravis CIでブラウザテスト
PHPとTravis CIでブラウザテストPHPとTravis CIでブラウザテスト
PHPとTravis CIでブラウザテスト
 
Shimokita.Unity パリの街をユニティちゃんが駆ける
Shimokita.Unity パリの街をユニティちゃんが駆けるShimokita.Unity パリの街をユニティちゃんが駆ける
Shimokita.Unity パリの街をユニティちゃんが駆ける
 
Dev opschef
Dev opschefDev opschef
Dev opschef
 
Paa s and oss
Paa s and ossPaa s and oss
Paa s and oss
 
New relic
New relicNew relic
New relic
 
Engine Yardで作る NetCommons3のクラウド環境
Engine Yardで作る NetCommons3のクラウド環境Engine Yardで作る NetCommons3のクラウド環境
Engine Yardで作る NetCommons3のクラウド環境
 
最近のCandyCane - PHP版Redmineでタスク管理を始めよう
最近のCandyCane - PHP版Redmineでタスク管理を始めよう最近のCandyCane - PHP版Redmineでタスク管理を始めよう
最近のCandyCane - PHP版Redmineでタスク管理を始めよう
 
PHPの教室「foreachを極める」
PHPの教室「foreachを極める」PHPの教室「foreachを極める」
PHPの教室「foreachを極める」
 
90分間濃縮 PHPエラーの教室
90分間濃縮 PHPエラーの教室90分間濃縮 PHPエラーの教室
90分間濃縮 PHPエラーの教室
 

20091030cakephphandson 02

  • 2. アジェンダ 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
  • 11. CakePHPが提供するクエリ実行機能 Modelを通じて下記の処理が可能 • 対象テーブル・主キーの指定 • データ構造を元にした更新クエリの自動実行 • 条件を元にした検索クエリの自動実行 • 任意のSQLの実行 CakePHPの代表的な機能 Copyright © YusukeAndo. 2009. All rights reserved. 11
  • 12. 対象テーブル・主キーの指定 モデル名を元に自動でテーブルを決定 例) モデル名:Book 対象テーブル:books idという名称のカラムを主キーとして認識 上記のルール外のテーブル、主キーを指定した い場合はモデルのプロパティに設定を行う 対象テーブルにNULLを指定する事でDBを使用 しないモデルとする事も可能 Copyright © YusukeAndo. 2009. All rights reserved. 12
  • 13. 対象テーブル・主キーの指定例 app/models/user.php class User extends AppModel { var $name = „User'; 使用するテーブル名 var $useTable = „user_account‟; var $primaryKey = „login_id‟; 主キーのカラム名 } 命名規則は必須ではなくあくまで「デフォルト」 Copyright © YusukeAndo. 2009. All rights reserved. 13
  • 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
  • 23. 検索時の注意点 比較演算子の指定方法はどうすれば? • カラム名の後に演算子を置く • 省略時は = として比較する句を生成 • 値が配列の場合は IN (n,n,n) に展開 →演算子をインジェクションされないように注意。 Copyright © YusukeAndo. 2009. All rights reserved. 23
  • 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
  • 31. validation機能 validation機能の概要 • Model内に各カラムの制限値を配列で設定 • save()メソッド実行時に自動で検査し通過時のみデータを 登録する。 • validatesメソッドで任意に実行も可能。 • 独自の検証ロジックが必要な際はModelのvalidatesをオー バーライドして実装する。 →scaffoldではこれらの機能がフル活用されている。 Copyright © YusukeAndo. 2009. All rights reserved. 31
  • 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
  • 48. Gravatarを表示 Copyright © YusukeAndo. 2009. All rights reserved. 48
  • 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
  • 54. まとめ Copyright © YusukeAndo. 2009. All rights reserved. 54
  • 55. まとめ CakePHPはとても簡単なMVCフレームワーク さまざまな機能を活用することでコード量を大きく減ら す事ができる 必要な情報はマニュアル・API・ネットからゲットする ‚Give back as much as you take‛ ブログに書く、誰かに教えてあげるなど自分が得た以 上のものを誰かに与えてあげましょう Copyright © YusukeAndo. 2009. All rights reserved. 55
  • 56. 質疑応答 ご静聴ありがとうございました。 Copyright © YusukeAndo. 2009. All rights reserved. 56