0

ユーザーのメモの表を表示するビューを作成しようとしています。メモにはタイプ (memo_type) と複数の作成者があります。作成者テーブルはレコードで構成されて id, memo_id, user_id, precedenceおり、MemoType は id, memo_type_descです。(メモには所有者 (Memo.user_id) もありますが、これは単純なクエリであり、問​​題なく動作する別のテーブルがあります)

アイデアは、ユーザーに関する詳細を表示するときに、ユーザーが作成者としてリストされているすべてのメモの表を表示し、メモの種類 (レター、プレゼンテーションなど) を含めることです。

したがって、recursive=3 の read() から必要な配列を取得できますが (以下の詳細を参照)、これは遅く、大量のデータを取得するため、contain を使用しようとしています。( memo_type_desc を省略することもできますが、エンドユーザーはそれを望んでいます。)

よし、入れpublic $actsAs = array('Containable'); app_model.php

ここで注意すべき重要な点は、MemoTypes の追加レベルの関連付けに関係なく、同じ配列が返されることです。追加 => array('MemoTypes.memo_type_desc') しても、配列に追加レベルは表示されません。そして、この第 3 レベルの関連付けでは、エラーも発生します。

警告 (512): モデル "Memo" はモデル "MemoTypes" に関連付けられていません [CORE/cake/libs/model/behaviors/containable.php、343 行目

モデルの関連付けは次のとおりです。user_controller の View 関数は次のとおりです。私の Memo/MemoTypes 関連付けまたは find() 構文の何が問題なのですか?

編集:ああ、私はケーキの初心者で、このアプリケーションを継承しました。PS、テーブルはview.ctpのforeachによって構築されていますが、ページネーションは確かに優れていますが、どこから始めればよいかわかりません。=O

// Trying to get Containable method to work...
$this->set('userstuff', $this->User->find('all', array(
    'conditions' => array('User.id' => $id),
    'contain' => array(
        'Author.user_id',
        'Author.precedence',
        'Author.memo_id' => array(
            'Memo.memo_type_id' => array(
                'MemoTypes.memo_type_id' // <--problem here?
            )
        )
    )
)));

結果:

Array
(
    [0] => Array
        (
            [User] => Array
                (
                    [id] => 1026
                    [group_id] => 2
                    [name] => John Doe
                    [username] => jd20001
                    [grpnum] => 99
                    [created] => 2010-03-22 15:08:35
                    [modified] => 2012-04-05 13:31:15
                )

            [Author] => Array
                (
                    [0] => Array
                        (
                            [user_id] => 1026
                            [precedence] => 0
                            [memo_id] => 2579
                            [Memo] => Array
                                (
                                    [memo_type_id] => 1
                                )

                        )

                    [1] => Array
                        (
                            [user_id] => 1026
                            [precedence] => 0
                            [memo_id] => 2583
                            [Memo] => Array
                                (
                                    [memo_type_id] => 1
                                )

                        )

                    [2] => Array...

もっと:

// Works, but retrieves entire users/memos tables so large memory footprint
$this->User->recursive = 3;
$this->set('user', $this->User->read(null, $id));

ユーザー.php:

var $belongsTo = array(
    'Group' => array(
        'className' => 'Group',
        'foreignKey' => 'group_id'
    )
);
var $hasMany = array(
    'Author' => array(
        'className' => 'Author',
        'foreignKey' => 'user_id',
        'dependent' => true
    ),
    'Memo' => array(
        'className' => 'Memo',
        'foreignKey' => 'user_id',
        'dependent' => false
    )
);

メモ.php:

var $hasMany = array(
    'Author' => array(
        'className' => 'Author',
        'foreignKey' => 'memo_id',
        'dependent' => true,
        'order' => 'precedence'
    )
);
var $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'MemoType' => array(
        'className' => 'MemoType',
        'foreignKey' => 'memo_type_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

Memo_type.php:

var $hasMany = array(
    'Memo' => array(
        'className' => 'Memo',
        'foreignKey' => 'memo_type_id',
        'dependent' => false
    )
);
4

1 に答える 1

0

まあ、もっとたくさん読んで、ようやく「理解」しました(そして、質問を投稿してからわずか1時間の努力...それがどのように機能するのか面白いです)。

ユーザーとグループは私の主な情報を提供し、メモは「所有」ドキュメントのテーブルを作成し、作成者はユーザーが作成者としてリストされているすべてのドキュメントに関するデータを提供します! うわー、CakePHP で 1 年間働いた後、私は今それを本当に感謝しています :)

$this->set('user', $this->User->find('first', array(
    'conditions' => array('User.id' => $id),
    'contain' => array(
        'Group',
        'Memo',
        'Author' => array(
            'Memo' => array(
                'MemoType' => array(
                    'fields' => array('memo_type_desc')
                )
            )
        )
    )
)));
于 2012-05-23T16:07:56.520 に答える