« [CakePHP1.3] 秀和システムの本 メモ3 - Formヘルパー | トップページ | [CakePHP1.3] 秀和システムの本 メモ5 - モデルクラスのメンバ変数とコールバック »

2012年5月31日 (木)

[CakePHP1.3] 秀和システムの本 メモ4 - データベースの利用1

書籍「CakePHP 1.3によるWebアプリケーション開発―オープンソース徹底活用」(秀和システム、掌田 津耶乃)のメモ その4。

データベースの利用。

データベースの利用

設定ファイル

ファイル名: app/config/database.php (初期状態は存在しないので、database.php.default をコピーして使用。)

変数名 $default$test は、モデルクラスで指定可能。未指定時は $default が利用される。 (メモ その5)

database.phpの連想配列のキー
キー 意味
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 (?)
成功。

関連

« [CakePHP1.3] 秀和システムの本 メモ3 - Formヘルパー | トップページ | [CakePHP1.3] 秀和システムの本 メモ5 - モデルクラスのメンバ変数とコールバック »

プログラム・スクリプト」カテゴリの記事

2019年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Amazonリンク

ダイビング写真(swf)

ブログ内検索

  • Google
    WWW を検索
    ブログ内を検索

リンク(いつもお世話さま)

  • ソニーストア
     iTunes Store(Japan)
    Just MyShop(ジャストシステム)
    ブックオフオンライン
無料ブログはココログ