0

投稿にはユーザー (belongsTo) があり、ユーザーにはプロファイル (hasOne) があります。通常はすべて機能します。投稿からユーザー、ユーザーからプロファイルにアクセスできます。

Post からは、すべて汎用の Find を使用して動作します。結果は多かれ少なかれこれです(たとえば、いくつかのキーを削除しました):

array(
    'Post' => array(
        'id' => '1',
        'category_id' => '1',
        'user_id' => '1',
        'title' => 'Example',
        'text' => '',
    ),
    'User' => array(
        'password' => '*****',
        'id' => '1',
        'group_id' => '1',
        'username' => 'mirko',
        'status' => 'active',
        'Profile' => array(
            'id' => '1',
            'user_id' => '1',
            'first_name' => 'Mirko',
            'last_name' => 'Pagliai',
        ),
    )
)

少数のフィールドのみを抽出したいときに「フィールド」を使用すると、問題が発生します。たとえば、これは機能します:

'fields'        => array('id', 'title', 'User.id')

結果は次のとおりです。

array(
    'Post' => array(
        'id' => '1',
        'title' => 'Articolo di prova :-)'
    ),
    'User' => array(
        'id' => '1'
    )
)

しかし、常に「フィールド」を使用して、プロファイルにアクセスする方法がわかりません。これらは機能しません:

'fields'        => array('id', 'title', 'User.id', 'Profile.id')

'fields'        => array('id', 'title', 'User.id', 'User.Profile.id')

「エラー: SQLSTATE [42S22]: 列が見つかりません: 1054 不明な列 'User.Profile.id' in 'field list'」というエラーが常に表示されます。

どうしたの?ありがとう。

編集:私は Containable 動作を使用していません。多分これが問題ですか?この場合、それは不可欠ですか?

ページネーションを使用した例:

$this->paginate = array(
    'conditions'    => $conditions,
    'fields'        => array('id', 'title', 'User.id', 'Profile.id'),
    'limit'         => 10,
    'recursive'     => 2,
);

EDIT2: @Hoff のおかげで、私は解決策に近づいています。しかし、まだ何か問題があります (そして、Containable は非常に便利です!)。AppModel.php に次を追加しました。

...
class AppModel extends Model {
    public $actsAs = array('Containable');
    public $recursive = -1;
...

しかし、これはうまくいきません:

$this->paginate = array(
            'conditions'    => $conditions,
            'contain'       => array(
                'User' => array(
                    'fields' => array('id'),
                    'Profile' => array(
                        'fields' => array('id', 'full_name'),
                    ),
                ),
                'Category' => array(
                    'fields' => 'title',
                ),
            ),
            'fields'        => array('id', 'user_id', 'category_id', 'title', 'created', 'modified', 'published'),
            'limit'         => 10,
        );

私が得る原因:

array(
    (int) 0 => array(
        'Post' => array(
            'id' => '1',
            'user_id' => '1',
            'category_id' => '1',
            'title' => 'Articolo di prova :-)',
            'created' => '2012-06-21 18:46:00',
            'modified' => '0000-00-00 00:00:00',
            'published' => true
        ),
        'Category' => array(
            'title' => 'prova',
            'id' => '1'
        ),
        'User' => array(
            'id' => '1'
        )
    )
)

しかし、ユーザー (電子メール、ユーザー名、パスワードなど) にフィールドを追加すると、次のように動作します。

            'User' => array(
                'fields' => array('id', 'username'),
                'Profile' => array(
                    'fields' => array('id', 'full_name'),
                ),
            ),

そして私は得る:

array(
    (int) 0 => array(
        'Post' => array(
            'id' => '1',
            'user_id' => '1',
            'category_id' => '1',
            'title' => 'Articolo di prova :-)',
            'created' => '2012-06-21 18:46:00',
            'modified' => '0000-00-00 00:00:00',
            'published' => true
        ),
        'Category' => array(
            'title' => 'prova',
            'id' => '1'
        ),
        'User' => array(
            'id' => '1',
            'username' => 'mirko',
            'Profile' => array(
                'id' => '1',
                'full_name' => 'Mirko Pagliai'
            )
        )
    )
)
4

1 に答える 1

1

「再帰」キーを使用する代わりに、containable 動作を使用することを強くお勧めします。動作に関するドキュメントは、こちらにあります。すべてのモデルに追加する必要がないように、AppModel で動作を適用することをお勧めします。Model/AppModel.php:

App::uses('Model', 'Model');
class AppModel extends Model {
    public $actsAs = array('Containable');
    public $recursive = -1;
}

次に、ページネーションのために:

$this->paginate = array(
    'conditions'    => $conditions,
    'fields'        => array('id', 'title'),
    'limit'         => 10,
    'contain' => array(
        'User' => array(
            'fields' => array('id'),
            'Profile' => array(
                'fields' => array('id')
            )
        )
    )
);
于 2012-06-25T16:15:26.870 に答える