CakePHP1.3.6:データベースをつかってみる。
前置きが長くなったが、データベースを使ってみる。
CakePHPは、データベースに対して、「モデル」と呼ぶ独自のDAO(Data Access Object)を提供している。
この場合のコンベンション(慣例、規約)は、
- テーブル名は複数形(最後にsをつける)。
- モデル名は単数形。
となる。
顧客(customer)を管理する画面をつくることにして、
- テーブル名は、customers。
- モデル名は、customer(クラス名はCustomer)。
- プログラム名は、Customers。
とする。
データベース接続の定義
テーブルの準備
/app/config/database.php.defaultをコピーして、database.phpを作成する。
ここでは、Fedra13にいれたMySQL5.1.12を使い、
- データベース(obs)を作成する。
- そのデータベースにcustomersテーブルを作成する。
- そのデータベースに権限をもつユーザーobsを作成する。
以下にDDLを示す。
CREATE TABLE IF NOT EXISTS `customers` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '顧客名', `zip` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '郵便番号', `address` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '住所', `tel` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '電話番号', `mobile` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '携帯電話', `mail` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'メール', `memo` text COLLATE utf8_unicode_ci NOT NULL COMMENT 'メモ', `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'タイムスタンプ', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
database.phpの作成
/app/config/database.phpを以下のようにする。
class DATABASE_CONFIG { var $default = array( 'driver' => 'mysqli', 'persistent' => false, 'host' => 'localhost', 'login' => 'obs', 'password' => 'obs', 'database' => 'obs', 'prefix' => '', ); var $test = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'test_database_name', 'prefix' => '', ); }
$testは、テスト用などに使う定義を書くが、ここでは変更しない。
モデルを作成する
/app/modelにcustomer.phpを作成する。
<?php class Customer extends AppModel { var $name = 'Customer'; } ?>
コントローラーの作成
/app/controllersに、customers_controller.phpを作成する。
<?php class CustomersController extends AppController{ public $name = 'Customers'; public $autoRender = false; function index(){ $data = $this->Customer->find('all'); print_r($data); } } ?>
コントローラーでは、$nameにモデル名を定義し、find('all')を呼び出すことで、全てのデータが取得できる。
確認
/localhost/cakesample/Customersにアクセスすると以下の画面を得る。
Array ( [0] => Array ( [Customer] => Array ( [id] => 1 [name] => 山田太郎 [zip] => 000-0000 [address] => 東京都新宿区xxx 0-0-0 [tel] => 03-0000-0000 [mobile] => 090-0000-0000 [mail] => taro.yamada@localhost.localdomain [memo] => 山田商事社長 [timestamp] => 2010-11-28 14:42:56 ) ) [1] => Array ( [Customer] => Array ( [id] => 2 [name] => 鈴木花子 [zip] => 111-1111 [address] => 東京都渋谷区区xxx 1-1-1 [tel] => 03-1111-1111 [mobile] => 090-1111-1111 [mail] => hanako.suzuki@localhost.localdomain [memo] => xxx株式会社担当者 [timestamp] => 2010-11-28 14:54:46 ) ) )
という配列になって、findから戻ることが分かる。