[CakePHP1.3] 秀和システムの本 メモ4 - データベースの利用1
書籍「CakePHP 1.3によるWebアプリケーション開発―オープンソース徹底活用」(秀和システム、掌田 津耶乃)のメモ その4。
データベースの利用。
データベースの利用
設定ファイル
ファイル名: app/config/database.php (初期状態は存在しないので、database.php.default をコピーして使用。)
変数名 $default や $test は、モデルクラスで指定可能。未指定時は $default が利用される。 (メモ その5)
キー | 意味 |
---|---|
driver | ドライバー(データベース)の種類。 'mysql', 'postgres', 'sqlite' など。 |
persistent | 持続的接続(persistent connection)を使う(TRUE)か、使わない(FALSE)か。 |
host | データベースサーバのホスト名(または IP アドレス)。 |
port | サーバに接続するための TCPポート、または Unixソケット。 |
login | ユーザ名。 |
password | パスワード。 |
database | データベース名。 |
prefix | すべてのテーブルの頭に付ける接頭辞(prefix)。 接頭辞が付いていないなら、空の文字列を指定。 |
schema | PostgreSQL データベースの設定時に、どのスキーマを使うか。 |
encoding | サーバの文字エンコーディング。'utf8' など。 |
ファイル名、テーブル名
項目 | 名前 | 例 |
---|---|---|
テーブル名 | アンダースコア記法。小文字。複数形。 | red_apples |
フィールド名 | アンダースコア記法。小文字。 | id, name, price, created, modified など。 |
モデル名 | テーブル名を単数形で、キャメル記法。 | RedApple |
モデルのクラス名 | モデル名と同じ。親クラスは AppModel クラス。 | RedApple |
モデルクラスのファイル名 | モデル名の小文字、アンダースコア記法。 フォルダは、app/models。 |
app/models/red_apple.php |
モデルを使うコントローラ名 | モデル名の複数形 + Controller。 このため、コントローラファイル名は「モデル名複数形アンスコ記法_controller.php」。 ビューは「app/views/モデル名複数形アンスコ記法」フォルダ。 |
RedApplesController |
異なるテーブル名を利用したい時には、モデルクラスの $useTable メンバ変数(メモ その5)を利用する。
また、フィールド名は、id が主キー、連番となるようにテーブル作成する。
主キーフィールドを別の名前にする場合、モデルクラスの $primaryKey メンバ変数(メモ その5) で指定する。
予備知識
Formヘルパーのデータをコントローラで受信する方法
Formヘルパーで生成した部品に入力されたデータが、コントローラへ送信されたときに受信するには、
$this->data[モデル名][フィールド名]
で受信する。
このとき、送信側のビューでは、各入力部品に name="data[モデル名][フィールド名]" が付いている状態。 ($form->text( 'モデル名.フィールド名' ); のように生成。textメソッドは、メモ その2。)
リダイレクト
リダイレクトするには、コントローラのメソッド redirect を利用する。
$this->redirect( './index' );
ただし、HTTPヘッダでリンダイレクトを通知するので、ブラウザ出力をする前か、出力をバッファリングしている必要がある。
条件配列
データベース操作では、検索条件や削除条件を WHERE句 で指定するが、 CakePHPでは、WHERE句の条件式を連想配列で指定する。その書き方。
=演算子の場合
array( 'モデル名.フィールド名' => '値' )
その他の演算子の場合
array( 'モデル名.フィールド名 >' => '値' )
array( 'モデル名.フィールド名 LIKE' => '%値%' )
など。
複数個の値を組み合わせる場合
array( 'モデル名.フィールド名 BETWEEN ? AND ?' => array( '値1', '値2' ) )
このとき、1つ目の ? に 値1、2つ目の ? に 値2 が入る。
複数個の式を組み合わせる場合(AND条件)
array( 'モデル名.フィールド名 LIKE' => '%値%' , 'モデル名.フィールド名 LIKE' => '%値%' , ... )
複数個の式を組み合わせる場合(OR条件)
array( 'OR' => array( 'モデル名.フィールド名 LIKE' => '%値%' , 'モデル名.フィールド名 LIKE' => '%値%' , ... ), )
scaffold
scaffold を利用すると、テーブルとコントローラのみで(モデルやビュー不要で)、 データベース操作用のページを自動作成してくれる。
scaffold を利用するには、次のように、メンバ変数 $scaffold を定義するだけ。
app/controllers/red_apples_controller.php
<?php
class RedApplesController extends AppController
{
public $name = 'RedApples';
public $scaffold;
}
?>
モデル
モデルのクラス定義
app/models/red_apple.php
<?php class RedApple extends AppModel { var $name = 'RedApple'; } ?>
最初はこの程度。バリデーションとかをクラス内に記述。
また、モデルクラスのメンバ変数については、メモ その5 参照。
モデルクラス利用
直接は利用しない。コントローラから間接的に利用する。
コントローラ内では、「$this->モデル名」がモデルクラスのインスタンスとなる。
app/controllers/red_apples_controller.php
<?php
class RedApplesController extends AppController
{
public $name = 'RedApples';
function index()
{
$data = $this->RedApple->find('all');
$this->set( 'data', $data );
}
}
?>
モデルクラスのメソッド
各メソッドでは、SQL文 SELECT、INSERT、UPDATE、DELETE のいずれかが実行されるが、 SQL文の実行でエラーが発生したときに呼び出されるコールバックメソッド onError が利用可能。 メモ その5 参照。
[抽出] find( 検索種別, オプション連想配列 )
データ抽出して、配列で返す。
find メソッド呼び出し前後に呼び出されるコールバックメソッド beforeFind(), afterFind() が利用可能。メモ その5 参照。
引数
- 検索種別
- 文字列で指定する。
引数 意味 'all' 全データを抽出する。 'first' 最初の1行を抽出する。 'list' 一覧(リストボックス)で利用できるようなリストを抽出する。
第2引数のキー 'fields' で抽出する列を指定できる。'count' 行数を取得する。 - オプション連想配列
- データ抽出時のオプションを連想配列で指定する。連想配列のキーは次の通り。
キー 意味 'conditions' 検索条件の指定。上で示した「条件配列」を値とする。
例: 'conditions' => array( 'RedApple.name LIKE' => '%apple%' )'fields' 抽出するフィールド名。フィールド名文字列の配列を値とする。
例: 'fields' => array( 'RedApple.name', 'RedApple.price' )'recursive' 再帰的に取得する深度。 'order' 抽出データの並び順(ORDER BY)を指定する。
例: 'order' => 'RedApple.name DESC'
例: 'order' => array( 'RedApple.name', 'RedApple.id DESC' )'group' グループ化(GROUP BY)して抽出する。
例: 'group' => 'RedApple.name''limit' 抽出データ数の制限(LIMIT)を指定する。
例: 'limit' => 20'offset' 抽出データのオフセットを指定する。
例: 'offset' => 40'page' 取得するページ数。
- 第1引数が'all'
- $arr[行番号][モデル名][フィールド名]
Array ( [0] => Array ( [RedApple] => Array ( [id] => 1 [name] => apple [price] => 100 ) ) [1] => Array ( [RedApple] => Array ( [id] => 2 [name] => grapes [price] => 150 ) ) ... )
- 第1引数が'first'
- $arr[モデル名][フィールド名]
Array ( [RedApple] => Array ( [id] => 1 [name] => apple [price] => 100 ) )
- 第1引数が'list'
- $arr[主キー列の値][name列かtitle列の値]
第2引数で 'fields' を指定しなかったとき、配列のキーは主キー列の値、配列の値はname列かtitle列の値となる。
また、モデルクラス内で、メンバ変数 $displayField で抽出する列名(name列やtitle列でない列名)を指定可能。Array ( [1] => apple [2] => grapse [3] => peach )
- 第1引数が'count'
- 行数の整数値。
3
[抽出] findAllByXxxx( 値 )
「列名 = 値」の抽出条件で全データを抽出する。
列名はメソッド名の Xxxx 部分に入れ(キャメル記法で)、引数で値を指定する。
メソッド名
- メソッド名の Xxxx の部分に列名をキャメル記法で記述。
引数
- 値
- 抽出条件となる値。=演算子の条件となる。
戻り値
- find('all')と同じ。
[抽出] findByXxxx( 値 )
列名 = 値 の抽出条件で、先頭のデータを抽出する。
列名はメソッド名の Xxxx 部分に入れ(キャメル記法で)、引数で値を指定する。
メソッド名
- メソッド名の Xxxx の部分に列名をキャメル記法で記述。
引数
- 値
- 抽出条件となる値。=演算子の条件となる。
戻り値
- find('first')と同じ。
[挿入/更新] save( データ配列 )
引数のデータを挿入(INSERT)あるいは更新(UPDATE)する。
主キー列の値がテーブルに存在するかどうかで、挿入か更新かを自動判別する。
save メソッド呼び出し前後に呼び出されるコールバックメソッド beforeSave(), afterSave() が利用可能。メモ その5 参照。
引数
- データ配列
- 挿入/更新するデータの連想配列。
$data[モデル名][フィールド名]
この連想配列は、上で示した、Formヘルパーのフォームで送信されたデータを、コントローラで受け取ったときのデータの構造。Array ( [モデル名] => Array ( [フィールド名] => 値 [フィールド名] => 値 ... ) )
戻り値
- FALSE
- 失敗。
- TRUE (?)
- 成功。
[更新] saveField( フィールド名, 値 )
特定のフィールドのみ更新する。あらかじめ更新対象のデータの主キーを指定しておく。
引数
- フィールド名
- フィールド名文字列。
- 値
- 更新する値。
戻り値
- FALSE
- 失敗。
- TRUE (?)
- 成功。
例
$this->RedApple->id = 1; $this->RedApple->saveField( 'price', 100 );
[更新] updateAll( データ配列, 条件配列 )
特定のフィールドのみ更新する。あらかじめ更新対象のデータの主キーを指定しておく。
引数
- データ配列
- 更新するデータの連想配列。
Array ( [フィールド名] => 値 [フィールド名] => 値 ... )
- 条件配列
- 削除条件を配列で指定する。上で示した「条件配列」。
戻り値
- FALSE
- 失敗。
- TRUE (?)
- 成功。
[削除] delete( 値 )、remove( 値 )
主キー列の値を指定してデータを削除する。
delete メソッド呼び出し前後に呼び出されるコールバックメソッド beforeDelete(), afterDelete() が利用可能。メモ その5 参照。
引数
- 値
- 主キー列の値。
戻り値
- FALSE
- 失敗。
- TRUE (?)
- 成功。
[削除] deleteAll( 条件配列 )
主キー列の値を指定してデータを削除する。
引数
- 条件配列
- 削除条件を配列で指定する。上で示した「条件配列」。
戻り値
- FALSE
- 失敗。
- TRUE (?)
- 成功。
関連
- メモ その3 - Formヘルパーの利用 (2012-05-30)
- メモ その2 (2012-05-22)
- メモ その1 (2012-05-18)
« [CakePHP1.3] 秀和システムの本 メモ3 - Formヘルパー | トップページ | [CakePHP1.3] 秀和システムの本 メモ5 - モデルクラスのメンバ変数とコールバック »
「プログラム・スクリプト」カテゴリの記事
- [CakePHP1.3] 秀和システムの本 メモ5 - モデルクラスのメンバ変数とコールバック(2012.06.04)
- [CakePHP1.3] 秀和システムの本 メモ4 - データベースの利用1(2012.05.31)
- [CakePHP1.3] 秀和システムの本 メモ3 - Formヘルパー(2012.05.30)
- [CakePHP1.3] CakePHP 1.3 によるWebアプリケーション開発(秀和システム) のメモ2(2012.05.22)
- [CakePHP1.3] CakePHP 1.3 によるWebアプリケーション開発(秀和システム) のメモ(2012.05.18)