カテゴリ: モデル

ページ: << 1 2 3 4 5 >>

バリデーション

パーマリンク 2008/07/07 16:57:22 著者: cakephp メール
カテゴリ: モデル, ビュー, コントローラー

CakePHP1.2 RC2

CakePHP1.2 ではバリデーション機能が充実されましたので、より使いやすくなったと思います。

Controller
バリデーションを呼び出します。

if ($this->Sample->validates()) {
}


Model

<?php
class Sample extends AppModel
{
    var $validate = array(
        'name' => array(
            array(
                'rule' => 'ruleName',
                'message' => 'ルールに従って入力してください。'
            ),
            array(
                'rule' => array('customFunc', 'hoge'),
                'message' => '正しくありません。'
            ),
        ),
        'memo' => array(
            array(
                'rule' => 'ruleName',
                'message' => 'ルールに従って入力してください。'
            ),
        ),
    );

    /**
     * カスタムチェック
     */
    function customFunc($value, $param)
    {
        if (・・・・・・・・) {
            return false;
        }
        return true;
    }
}

ruleName に当たる部分の内容がとても充実しています(詳しくはこちら)が、それ以外のチェックを行いたい場合は、customFunc のように自由に function を作成し、rule から呼び出すことが出来ます。
$value には $this->data のデータが配列で入ってきます。


View

<?php e($form->error('Sample/name')); ?>

モデルで設定したメッセージを表示させたい箇所に上記のように記載します。

テーブルの項目を変更した時の注意点

パーマリンク 2008/06/24 16:47:17 著者: cakephp メール
カテゴリ: モデル

テーブルの設計が途中で変更になることがあると思います。
そういったときに気をつけなければならない事があります。

CakePHP では、app/tmp/cache/models/ 以下にモデルの情報がキャッシュされますので、既存テーブルにカラム追加や変更、削除を行っても、ここのファイルが変わらない限り、昔のテーブル構成のまま動こうとします。
ですので、ここのファイル(items モデルなら default_items)を削除することを忘れないようにしましょう。

入力チェックのやり方

パーマリンク 2008/06/20 13:49:11 著者: cakephp メール
カテゴリ: モデル

CakePHP1.1

CakePHP には標準で、空かどうか、数値かどうかなど、幾つかのチェック方法が用意されています。
ですが、あえてそれを使わずに下記のように書きます。

<?php
class Sample extends AppModel {

    /**
     * 入力チェック
     */
    function validates($data = array())
    {
        $validate_flg = 0;
        if (empty($data)) {
            $data = $this->data;
        }

        $name = $data['Sample']['name'];

        if (empty($name) && $name != '0') {
            $this->invalidate('name');
            $validate_flg = 1;
        } elseif (*********) {
            // 色々なチェック
        }

        if ($validate_flg == 0) {
            return true;
        } else {
            return false;
        }
    }
}

このように name という項目に対してチェックする内容を一箇所に集約することで、見やすくなったと思いませんか?

好きな時に好きなキーでアソシエーションする方法

パーマリンク 2008/06/15 18:42:59 著者: cakephp メール
カテゴリ: モデル

通常のアソシエーションのやり方だと、必要ない時に外すという処理が必要になってきます。
そのテーブル単体のデータが欲しい頻度とアソシエーションしたデータが欲しい頻度の比率にもよると思いますが、単体のデータを取得する方が多い場合は、こちらのやり方が良いのではないでしょうか。

また、通常のアソシエーションの場合、結合させるキーは決まっています。
任意のキーで結合したい場合はなかなかうまくいきません。
そんな時も今回の方法だとうまくいきます。

1.アソシエーションの準備

まずはアソシエーションの準備として、app/app_model.php に下記の内容を追加します。

<?php
class AppModel extends Model
{
    // アソシエーションの設定
    public function expects($array)
    {
        foreach ($array as $assoc) {
            $this->bindModel( 
                array($this->assocs[$assoc]['type'] => 
                    array($assoc => $this->assocs[$assoc]))
            ); 
        } 
    }
}

2.各モデルの設定

どのモデルとどの形式でアソシエーションさせるかを設定します。

<?php
class Sample extends AppModel
{
    // アソシエーション設定
    public $assocs = array(
        // 商品マスタ
        'Item' => array(
            'type' => 'hasAndBelongsToMany',
            'className' => 'Item',
            'joinTable' => 'samples_items',
            'foreignKey' => 'sample_id',
            'associationForeignKey' => 'item_id',
        ),
    );

type の部分に他のアソシエーションの形式(hasOne など)も設定できます。

3.コントローラーから呼び出す

そのままアソシエーションさせる場合は、下記のようにすることで呼び出すことが出来ます。

$this->Sample->expects(array('Item'));
$data = $this->Sample->findAll();


キーを変更する場合

$this->Sample->primaryKey = 'item_id'; // キーの変更

$this->Sample->expects(array('Item'));
$data = $this->Sample->findAll();

$this->Sample->primaryKey = 'id'; // キーを元に戻す


Item テーブルに対して条件を指定したい場合

$this->Sample->assocs['Item']['conditions'] = array('name' => 'hoge');
$this->Sample->expects(array('Item'));
$data = $this->Sample->findAll();

統一で使える条件はモデルに直接記載し、可変の条件はコントローラで指定すれば良いですね。

参考:使用するアソシエーションをコントローラで決める[CakePHP]

コンポーネントでモデルを使う方法

パーマリンク 2008/06/09 22:00:06 著者: cakephp メール
カテゴリ: モデル, コンポーネント

loadModelを使うことでモデルを呼び出すことができます。

<?php
loadModel('Model1');
loadModel('Model2');

class SamplesComponent extends Object
{
    function hoge() {
        $dbo_model1 = new model1();
        $dbo_model2 = new model2();

        $data1 = $dbo_model1->find();
        $data2 = $dbo_model2->find();
    }
}

モデルを複数呼び出す時は上記のようにloadModelを2つ並べて書きます。


find などの処理は上記の方法でも可能ですが、Model に書いたバリデーションを絡めた動きにしたい時は上記の方法ではうまくいきません。
その場合は、下記の方法で Model を呼び出します。

<?php
class SamplesComponent extends Object
{
    function startup(&$controller){
        $this->controller = $controller;
    }

    function hoge($data) {
        $this->controller->Model1->validates($data);
    }
}

<< 1 2 3 4 5 >>

2017年10月
 << <   > >>
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 31        

CakePHPに関する情報をまとめていきます。

開発スピードがアップできればうれしいです。

>>連絡はこちらへどうぞ



CakePHP最新版
CakePHP 1.2.3.8166


CakePHPの書籍

CakePHPによる実践Webアプリケーション開発

CakePHP1.2で作成する人にオススメ。
とても参考になります。

まるごとPHP!(vol.2)

安藤さんの解説が載っています。
AmazonのPagination部分は参考になります。

CakePHPによるWebアプリケーション開発

まだ読んだことありません

CakePHPポケットリファレンス
CakePHPポケットリファレンス
CakePHP1.2 でやるなら、これがあると何かと便利♪

CakePHP徹底入門
CakePHP徹底入門
CakePHP1.2 を今から始めるならここから

Fast CakePHP
Fast CakePHP
シンプルでわかりやすい CakePHP の入門書

CakePHPガイドブック
CakePHPガイドブック
CakePHP1.1 ではとても参考にした CakePHP 最初の入門書

検索

XMLフィード

16ブログ     powered by b2evolution