1

モデルの関連付けについて質問があります。次のアプリケーションについて考えてみます。毎月、ユーザーに新しい質問があります。これらには、この質問に関するヒントを提供する機能があり、他のユーザーには、このヒントに反応する機能があります。私のモデル設定は次のようになります。

Users hasMany Tips, Reactions

Tips belongsTo User

Tips hasMany Reactions

Reactions belongsTo User, Tip

今、私はすべてのユーザーからその質問に関するすべてのヒントを得たいと思います。私はヒントテーブルですべてを簡単に見つけて、ユーザーと反応に関連するすべてのヒントを返します。ただし、反応にはユーザーが含まれていません。これは明らかに非常に重要です。

Cakeは、検索結果をすべて2つのクエリに自動的に変換します。1つはユーザーを結合するtipsテーブルにあり、もう1つはreactionsテーブルにありますが、users-tableには結合がありません。これが必要です。

だから私の質問は:なぜユーザーテーブルが反応に参加しないのですか、そしてどうすればこれを解決できますか?

コード:

ユーザーモデル:

public $hasMany = array('Tip', 'Reaction');

ヒントモデル:

public $hasMany = array('Reaction' => array(
        'foreignKey' => 'tip_id'
    ));

public $hasOne = array('User' => array(
        'fields' => array(
            'User.id, User.first_name, User.last_name'
        ),
        'foreignKey' => 'id'
    ));

反応モデル:

public $belongsTo = array('Tip', 'ReactionUser' => array(
        'className' => 'User',
        'foreignKey' => 'id'
    ));

コントローラ:

$tips = $this->Tip->find('all');

出力:

array(
    (int) 0 => array(
        'Tip' => array(
            'id' => '1',
            'user_id' => '1',
            'question_id' => '1',
            'tip' => 'Testing da new datavbase',
            'votes' => '0',
            'approved' => '1',
            'pic' => '',
            'created' => '2012-05-18 09:22:56'
        ),
        'User' => array(
            'id' => '1',
            'first_name' => 'Bart',
            'last_name' => 'De Bock'
        ),
        'Reaction' => array(
            (int) 0 => array(
                'id' => '1',
                'tip_id' => '1',
                'user_id' => '1',
                'reaction' => 'lorem ipsum',
                'votes' => '0',
                'approved' => '1',
                'pic' => '',
                'created' => '0000-00-00 00:00:00'
            )
        )
    ),
    (int) 1 => array(
        'Tip' => array(
            'id' => '2',
            'user_id' => '2',
            'question_id' => '1',
            'tip' => 'Test',
            'votes' => '0',
            'approved' => '1',
            'pic' => '',
            'created' => '2012-05-18 10:22:51'
        ),
        'User' => array(
            'id' => '2',
            'first_name' => 'Deborah',
            'last_name' => 'Rochtus'
        ),
        'Reaction' => array(
            (int) 0 => array(
                'id' => '2',
                'tip_id' => '2',
                'user_id' => '3',
                'reaction' => 'Say whaat?',
                'votes' => '2',
                'approved' => '1',
                'pic' => '',
                'created' => '2012-05-18 10:33:32'
            ),
            (int) 1 => array(
                'id' => '3',
                'tip_id' => '2',
                'user_id' => '4',
                'reaction' => 'Hmmm..',
                'votes' => '0',
                'approved' => '1',
                'pic' => '',
                'created' => '2012-05-18 10:33:44'
            )
        )
    )
)

ご覧のとおり、これらのリアクションには関連するユーザーが含まれていません...

ご協力いただきありがとうございます!

4

2 に答える 2

0

使用内容:

AppModel では:

public $uses = array('Containable');

検索呼び出しを次のように変更します。

$this->Tip->find('all', array('contain' => array('User', 'Reaction' => array('User'))));

于 2012-05-18T14:32:52.097 に答える
0

これを試してください

$tips = $this->Tip->find('all' array( 'recursive'=>'2' ) );

再帰値は、必要に応じて 1、2、3、4 などです。

于 2012-05-19T04:04:34.247 に答える