CakePHP情報のまとめ

データベースの基本

  • 各テーブルごとにModelを作成する
  • データベースにはModelからアクセスする(AppModelクラスを継承)

データベースの設定ファイル

app/config/database.php

データべースを使用しないページの場合

コントローラーのメンバ変数$usesをnull or array()に設定する
var $uses = null;

レコードの検索(SELECT)

findAll

参考
どうにかなるBLOG :: CakePHP のモデル関数 findAll
http://dounikanarublog.com/detail/13

find

find(第1引数, 第2引数)
第1引数
all全レコード
first最初の1レコード
listレコードのリスト
countレコード数
第2引数
連想配列で指定
conditionsWHERE句で指定する条件。フィールド名をキーに、検索条件値を値とする連想配列array('Table.id'=>$this->data['Table']['id'])
fields取得するフィールド名
recursive再帰的に取得する深度
order取得順
limit取得するレコード数(limit)
page取得するページ数
WHERE句でLIKEや不等号などの条件を使うには
$data = $this->Table->find('all', array('conditions'=>array('Table.name like'=>"%{$this->data['Table']['name']}%")));
とする。
実際のSQL文は
WHERE `Board`.`name` like '%NAMEVALUE%'
となる。
不等号の場合は
'Table.name >'
とする。
より複雑なWHERE句の条件式を使うには
プリペアドステートメント的に「?」を使って記述する。最後の配列の値が順番に「?」に代入される。
$data = $this->Table->find('all', array('conditions'=>array('Table.id between ? and ?'=>array(1,5)));
この場合のSQL文は
WHERE `Table`.`id` BETWEEN 1 AND 5
となる。

  • 複雑なWHERE句の条件式でSELECTする場合には結局SQL文を書いている場合と大差なくなる

findAllBy

find()をよりシンプルにしたメソッド。
WHERE カラム名 = 値
で検索する単純なSELECT文の場合はfind()よりもこちらを使う方がシンプルで簡単。
$this->モデル名->findAllByカラム名(検索条件, 取得カラム, 件数, ページ数, 階層)
フォームから送られたIDの値で検索するには
$this->モデル名->findAllById($this->data['モデル名']['id'])
とする。

findBy

findAllBy()は検索条件に合致する全てのレコードを取得するが、findBy()は検索条件に合致する中から最初の1レコードのみを得る

レコードの削除(DELETE)

レコードの削除には2通りの方法がある。

IDを指定して削除

 del(削除するレコードのID)
 remove(削除するレコードのID)
働きは2つとも同じ。
  • 指定したIDが無くても特に例外などは発生しない

条件から検索して削除

deleteAll(削除するレコードの抽出条件の連想配列)
find()のconditionsと同じように指定する。
$this->モデル名->deleteAll(array('テーブル名.id between > and ?' => array(1.5)))
から生成されるSQL文は
WHERE `テーブル名`.`id` BETWEEN 1 AND 5
となる。(IDが1から5のレコードを削除する。)

レコードの保存(INSERT/UPDATE)

レコードの追加(INSERT)および更新(UPDATE)は、どちらも
save(保存データ)
にて行う。
該当データのIDがあればUPDATE、無ければINSERTする。

特定のフィールドのみ更新

saveField(カラム名, 更新する値)

条件に合致するレコード全てを更新

updateAll(更新内容, 条件)

複数テーブル(JOIN)

  • [準備]Controllerクラス内で使用テーブルを$usesに設定する。
public $uses = array('Table1', 'Table2');

LEFT JOIN

hasOne
  • 左テーブルのレコードと右テーブルのレコードが常に1対1で対応している
Modelにて
public $hasOne = array(
    'テーブル名' => array(
        'conditions' => 'オプション設定連想配列',
        'order' => '並び順',
        'dependent' => true/false,
        'foreignKey' => 'キーとなるフィールド名'
    ),
    .....
);
dependent: レコード削除時に結合側のレコードも削除するかどうか(true/false)
foreignKey: 結合キー
belongsTo
  • 左テーブルに右テーブルが属する状態(1対多)
public $belongsTo = array(
    'テーブル名' => array(
        'className' => 'クラス名',
        'conditions' => 'オプション設定連想配列',
        'order' => '並び順',
        'foreignKey' => 'キーとなるフィールド名'
    ),
    .....
);
foreignKey: 結合キー

WHERE IN

hasMany
  • 1対多
public $hasMany = array(
    'テーブル名' => array(
        'className' => 'クラス名',
        'conditions' => 'オプション設定連想配列',
        'order' => '並び順',
        'dipendent' => true/false,
        'limit' => 最大レコード数(0で無制限),
        'exclusive' => true/false,
        'findQuery' => '',
        'foreignKey' => 'キーとなるフィールド名'
    ),
    .....
);
dependent: レコード削除時に結合側のレコードも削除するかどうか(true/false)
exclusive: 元テーブル側のデータを削除する際に結合側の関連レコードを全て削除するかどうか
foreignKey: 結合キー

  • hasOne/ belongsTo / hasManyは結合側のテーブルのforeignKeyとなるフィールド名を「元テーブルのフィールド名_id」とすることでModelへの設定の記述を簡略化できる。

ダイナミックバインド
Modelでの設定の一時的なの変更
bindModel()
$this->モデル名->bindModel(結合設定の連想配列);
unbindModel()
$this->モデル名->unbindModel(結合設定の連想配列);
  • デフォルトでは、設定の変更はその直後のみ。設定を永続化するにはbindModel()/unbindModel()の第2引数を「false」にする。

このページへのコメント

hcsChx <a href="http://ecfjhiqmgfgs.com/">ecfjhiqmgfgs</a>, [url=http://tckcojflievj.com/]tckcojflievj[/url], [link=http://kgatgbosaqyl.com/]kgatgbosaqyl[/link], http://rjqfmvzdqpax.com/

0
Posted by cnwiakf 2013年11月19日(火) 21:44:22 返信

uEeG5X <a href="http://hckgarnjteds.com/">hckgarnjteds</a>, [url=http://dsvpoakovcko.com/]dsvpoakovcko[/url], [link=http://eddfnyabrgon.com/]eddfnyabrgon[/link], http://kouxgpvcrtpt.com/

0
Posted by jcekdeek 2013年11月15日(金) 04:01:32 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

編集にはIDが必要です