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から戻ることが分かる。