「cakephp」カテゴリーアーカイブ

HasAndBelongsToMany

class Recipe extends AppModel {
    public $name = 'Recipe';
    public $hasAndBelongsToMany = array(
        'Ingredient' =>
            array(
                'className'              => 'Ingredient',
                'joinTable'              => 'ingredients_recipes',
                'foreignKey'             => 'recipe_id',
                'associationForeignKey'  => 'ingredient_id',
                'unique'                 => true,
                'conditions'             => '',
                'fields'                 => '',
                'order'                  => '',
                'limit'                  => '',
                'offset'                 => '',
                'finderQuery'            => '',
                'deleteQuery'            => '',
                'insertQuery'            => ''
            )
    );
}

className: 元モデルに関連付けられるモデルのクラス名。Recipe HABTM Ingredient を定義したい場合、’Ingredient’となります。

joinTable: このアソシエーションに使う中間テーブルの名前。テーブル名がHABTMテーブルの規約に従っていない場合に指定します。

with: joinするテーブルのモデル名を定義します。デフォルトではCakePHPはモデルを自動的に生成します。上記のサンプルでは、IngredientsRecipeです。このキーを使うことで、このデフォルトの名前を上書きすることができます。この名前のモデルクラスを生成することで、他の通常のモデルと同じようにたとえば追加の列や情報を取得するようにカスタム動作を定義できます。

foreignKey: アソシエーション先のモデルを検索するための外部キーの名前。これは複数のHABTMを定義するためによく使われます。このキーのデフォルト値はアソシエーション先のモデルの単数形に _id がついたものです。

associationForeignKey: アソシエーション先のもう一方のモデルを検索するための外部キーの名前。これは複数のHABTMを定義するためによく使われます。このキーのデフォルト値はアソシエーション先のモデルの単数形に _id がついたものです。

unique: bool値、または文字列で keepExisting を指定します。
trueを指定すれば(これがデフォルトです)、新しいレコードを挿入する前に既存の関連するレコードを削除します。
falseを指定すれば、saveを実行してレコードを挿入したあとに、joinできないレコードがあれば削除されます。
keepExisting を指定すれば、 true を指定した時と似ていますが、既存の関連レコードは削除されません。

conditions: find()に指定するconditionsと互換性のある配列もしくはSQL文字列を指定します。アソシエーション先のテーブルに条件を指定したければ、’with’ に指定したモデルを使って必要なbelongsToアソシエーションを定義してください。

fields: アソシエーション先のモデルから取得するフィールドのリスト。デフォルトで全フィールドが含まれます。

order: find()に指定するorderと互換性のある配列もしくはSQL文字列を指定します。

limit: アソシエーションモデルのデータの最大行数。

offset: アソシエーションモデルのデータをスキップする行数。

finderQuery, deleteQuery, insertQuery: データ取得、削除、追加の時に使われるSQLクエリを指定します。これは、動作をカスタマイズしたい時に使います。

参考

http://book.cakephp.org/2.0/ja/models/associations-linking-models-together.html

CakePHPのHasAndBelongsToManyを使う

http://www.webopixel.net/cakephp/259.html

belongsTo

<?php

class Profile extends AppModel {
    var $name = 'Profile';
    var $belongsTo = array(
        'User' => array(
            'className'    => 'User',
            'foreignKey'    => 'user_id'
        )
    );
}
?>

belongsTo 関連の配列で有効なキーは以下のようになります:

  • className: 現在のモデルに関連したモデルのクラス名。‘Profile belongsTo User’ という関係を定義する場合、className キーは‘User’になります。
  • foreignKey: 現在のモデルにある外部キー名。複数の belongsTo 関係を定義する必要がある場合に、これは特に便利です。このキーのデフォルト値は、他のモデル名のアンダースコアで区切られた単数形で、末尾に‘_id’が付きます。
  • conditions: 関連モデルのレコードを限定するために使用する SQL。SQL にモデル名を使用するのは良い習慣となります: “User.active = 1” は常に“active = 1”よりも推奨されます。
  • fields: 関連モデルのデータを取得した際に取り出すフィールドのリスト。デフォルトではすべてのフィールドを返します。
  • counterCache: (bool) true にセットすると、save() または delete() が呼び出されるたびに、関連モデルは自動的に外部テーブルの“[singular_model_name]_count”というフィールドをインクリメントまたはデクリメントします。カウンタフィールドの値は関連する行の番号を表します。
  • order: 返される関連する行の並び順を定義する SQL。

$hasOne

class User extends AppModel {
    var $name = 'User';
    var $hasOne = array(
        'Profile' => array(
            'className'    => 'Profile',
            'conditions'   => array('Profile.published' => '1'),
            'dependent'    => true
        )
    );

  • className: 現在のモデルに関連したモデルのクラス名。‘User hasOne Profile’ という関係を定義する場合、className キーは‘Profile’ になります。
  • foreignKey: もう一方のモデルにある外部キーの名前。複数の hasOne 関係を定義する必要がある場合に特に便利です。このキーのデフォルト値は、現在のモデル名のアンダースコア区切りの単数形で、末尾に‘_id’をつけたものです。上記の例では、’user_id’ となります。
  • conditions: 関連モデルのレコードを限定するための SQL。SQL 内でモデル名を使用することを習慣にしておくようにしておきましょう:“approved = 1.” よりも、“Profile.approved = 1” の方が良い記述です。
  • fields: 関連モデルのデータが取得された際に取り出すフィールドのリストです。デフォルトではすべてのフィールドを返します。
  • dependent: dependent キーを true にセットし、delete() メソッドの cascade 引数を true をセットして呼び出すと、関連するモデルのレコードも併せて削除されます。この場合、true をセットしているので、User を削除すると、関連する Profile も削除します。

 

お気に入り 役立つ

CakePHP開発者が知るべき10のこと

http://1-byte.jp/2011/03/09/10_things_you_must_know_about_cakephp/

CakePHPブログチュートリアル

http://book.cakephp.org/1.3/ja/view/1528/CakePHP%E3%83%96%E3%83%AD%E3%82%B0%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB

CakePHP のおいしい食べ方

http://cakephp.seesaa.net/

CakePHP/ビュー

http://yakinikunotare.boo.jp/orebase2/cakephp/view

CakePHP アプリケーションの流れを追う

http://www.slideboom.com/presentations/34211/CakePHP-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%B5%81%E3%82%8C%E3%82%92%E8%BF%BD%E3%81%86

CakePHP 日本語フォーラム

http://cakephp.jp/modules/newbb/

CakePHP ViewHelperの使い方

http://www.1×1.jp/blog/2006/08/cakephp_viewhelper.html

[ステップアップ! CakePHP] Controller で Component を使う

http://c-brains.jp/blog/wsg/10/05/24-173034.php

CakePHP Viewの基本

http://dwi.blog101.fc2.com/blog-entry-13.html

[mac] Mac OS X LionにEclipseをインストールして日本語化までのメモ

http://www.la-nouveau.mydns.jp/wordpress/?p=1302

xdebug

http://jacoyutorius.wordpress.com/2010/10/09/mac%E3%81%ABphp%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E7%92%B0%E5%A2%83%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/

CakePHPで入力値を取得・表示するだけのプログラム

http://1bit.mobi/20110213191557.html

モデル

モデルの記述

//——————————————————————————–

// 初期データ取得

//——————————————————————————–

function getIni() {

$data = array();

return $data;

}

コントローラ

コントローラの処理

//初期設定/////////////////////////////////////////

if( empty( $this->data ) ){

$this->data = $this->Fruit->getIni(); //初期値設定

}

$this->__setViewEdit(); //ビューに必要な情報を渡す

////////////////////////////////////////////////////////

if( empty( $this->data ) ){ 

・・・もしコントローラのデータがなかったら(画面入力していない状態)

$this->data = $this->Fruit->getIni();

    ・・・コントローラからFruitモデルクラスのgetIni()関数を実行する

View

ビューの処理

[text]echo $appForm-&#62;create();[/text]

・・・Formの始まりです。別に定義している関数でFormの開始タグを出力します。

[php]<?php echo $titleName ?&#62;>[/php]

コントローラでセットした$titleNameが出力

[php]<?php echo $appForm-&#62;input(‘Fruit.name’,array(‘type’=&#62;’text’,’class’=&#62;’wSizeM’))?&#62;[/php]

入力する項目のラベルとテキストボックスを配置

第一引数にこの入力タグに対応する{モデル名.列名}

第二引数は配列になっており、INPUTタグに通常与える属性‘type’ => ‘text’ ・・・ テキストボックス

CSS で事前に設定したWSizeM をclass で指定

echo $appForm->end();

・・・別に定義する関数で、Formの閉じタグが出力されます。

登録処理

<input type=”submit” name=”save” id=”save” value=”登録” />

 登録ボタンのname属性値は「save」、つまり登録ボタンが押された時コントローラにはこ

の名前で登録ボタン押下が通知されます。

通知の受け取り方は下記です。

//登録

if( isset( $this->params[‘form’][‘save’] ) ) {

}

 登録ボタンが押されたら・・・

1 入力チェック

2 入力チェックがOKならDBへ登録、NGならエラー表示

3 DBへの登録後は登録完了メッセージを表示(この時登録したデータが表示されて

いる)

メモ

メモ

  • 内部でのみ使う関数の名前にはアンダースコアを接頭辞として命名。

モデル:単数形 ファイル名

コントローラ:複数形 ファイル名

ビュー:複数形 フォルダ名

 

  • 画面で入出力するデータは、CakePHPの中ではコントローラがdataという名前で配列として保持します。

 

参考サイト

CakePHPプラグインのまとめ – 総括編

http://1-byte.jp/2010/09/06/introduce_cakephp_plugins/

メディアビューの使い方 –

http://yoichiuomi.com/blog/2010/12/cakephp-using-mediaview/

Smartyとフレームワーク(その1:CakePHP編)

http://www.phppro.jp/school/smarty/vol11/1