2013年5月3日金曜日

[CakePHP]基本

CakePHPの基本構成
CakePHPはModel, Controller, Viewの3要素から構成される。
  • Database
    データベースのテーブル名は複数形で定義する。例えばユーザ情報を保持するデータベースであればusersと複数形にする。
  • Model
    /app/models/以下に単数形で定義ファイルを置く。先ほどのusersテーブルに対する定義は/app/models/user.phpに記述する。ファイル名は単数形であることに注意。
    class User extends AppModel
    
  • Controller
    /app/controllers/以下に複数形+_controllerという定義ファイルを置く。usersテーブルに対するコントローラは/app/controllers/users_controller.phpとファイル名が複数形になることに注意。
    class UsersController extends AppController
    
  • View
    /app/views/以下に複数形のディレクトリを作成し、controllerが処理するための入り口ページを置く。先ほどのusers_controller.phpにindexページから入った時の処理を記述してあるならば、/app/views/users/index.ctpというファイルを置く。views下のディレクトリ名が複数形であることに注意。
以上の設定をしてブラウザから/app/users/にアクセスするとUsersで定義したページが見られるようになる。
見た目はviews以下のindex.ctpに従う
表示されるデータはcontrollers以下のusers_controller.phpに従う

データベースアクセスのための基本
データベースのテーブル1つに対してModelが1つ対応する
テーブル名は複数形で付け、idというprimary, auto_incrementのフィールドを準備する


Table: CakePHP の要素
Databaseusersprofilesdiaries
ModelUserProfileDiary
ControllerUsersControllerProfilesControllerDiariesController
Viewapp/views/users/index.ctpapp/views/profiles/index.ctpapp/views/diaries/index.ctp

Table: usersテーブル
idINT(10)Primary key, auto_increment
usernameVARCHAR(32)
passwordVARCHAR(32)
Table: profilesテーブル
idINT(10)Primary key, auto_increment
user_idINT(10)users.idへの外部キー
hobbyVARCHAR(256)
Table: diariesテーブル
idINT(10)Primary key, auto_increment
user_idINT(10)users.idへの外部キー
dateDATETIME
contentTEXT(1000)
  • アソシエーションを定義する
    • アソシエーションによりデータベーステーブルに定義した外部キーを使用してテーブル間のリレーションを構築できる。
      usersにはprofilesが1つとdiariesが複数ぶら下がる構成とする場合models/user.phpに$hasOneと$hasManyを定義する。
      データベースの命名規則がCakePHPのものに従っていればこれだけでOK。
      <?php
      class User extends AppModel
      {
       var $name = 'User';
       var $hasOne = 'Profile';
       var $hasMany = 'Diary';
      }
      ?>
    • 続いてprofilesはusersにぶら下がっている(属している)ことを定義する。
      models/profile.phpに$belongsToを記述する。
      <?php
      class Profile extends AppModel
      {
       var $name = 'Profile';
       var $belongsTo = 'User';
      }
      ?>
    • 同様にdiariesはusersにぶら下がっている(属している)ことを定義する。
      models/diary.phpに$belongsToを記述する。
      <?php
      class Diary extends AppModel
      {
       var $name = 'Diary';
       var $belongsTo = 'User';
      }
      ?>


デバッグ
views/users/index.ctp内に
<?php debug($user, $showHTML=true, $showForm=false); ?>
と書くと以下のように表示してくれる。
Array
(
    [0] => Array
    (
        [User] => Array
            (
                [id] => 1
                [username] => user1
                [password] => password1
            )

        [Profile] => Array
            (
                [id] => 1
                [user_id] => 1
                [hobby] => 読書
            )

        [Diary] => Array
            (
                [0] => Array
                    (
                        [id] => 1
                        [user_id] => 1
                        [date] => 2009-02-20 14:22:06
                        [content] => テストです。
                    )
            )
    )

    [1] => Array
    (
        [User] => Array
            (
                [id] => 2
                [username] => user2
                [password] => password2
            )

        [Profile] => Array
            (
                [id] => 2
                [user_id] => 2
                [hobby] => 映画鑑賞
            )

        [Diary] => Array
            (
                [0] => Array
                    (
                        [id] => 2
                        [user_id] => 2
                        [date] => 2009-02-19 14:22:17
                        [content] => はじめまして
                    )

                [1] => Array
                    (
                        [id] => 3
                        [user_id] => 2
                        [date] => 2009-02-20 14:37:30
                        [content] => 2度目の更新です。
                    )

                [2] => Array
                    (
                        [id] => 4
                        [user_id] => 2
                        [date] => 2009-02-21 14:37:45
                        [content] => 明日の予定は・・・
                    )
            )
    )
)

0 件のコメント:

コメントを投稿