0

一个帖子有一个用户(belongsTo),一个用户有一个个人资料(hasOne)。通常一切正常:我可以从 Post 到 User 以及从 User 到 Profile 访问。

从 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'
    )
)

但我不明白,总是使用“字段”,如何访问 Profile。这些不起作用:

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

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

我总是收到此错误“错误:SQLSTATE [42S22]:找不到列:1054 '字段列表'中的未知列'User.Profile.id'”。

怎么了?谢谢。

编辑:我没有使用 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

我强烈建议不要使用“递归”键,而是使用可包含的行为。可以在此处找到有关该行为的文档。我建议在您的 AppModel 中应用该行为,这样您就无需将其添加到所有模型中。在模型/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 回答