CakePHP:当有多个关联记录时如何指定返回字段

Posted

技术标签:

【中文标题】CakePHP:当有多个关联记录时如何指定返回字段【英文标题】:CakePHP: how to specify returned fields when there are multiple associated records 【发布时间】:2013-11-26 18:51:55 【问题描述】:

我正在使用一组相当复杂的条件进行find('all')

array(
    'conditions' => array(
        (int) 0 => 'Attempt.test_id = 8',
        (int) 1 => 'Attempt.score > 60',
        (int) 2 => array(),
        (int) 3 => array(
            (int) 0 => 'Resume.has_file = 1'
        )
    ),
    'joins' => array(
        (int) 0 => array(
            'table' => 'attempts',
            'alias' => 'Attempt',
            'type' => 'LEFT',
            'conditions' => array(
                (int) 0 => 'Attempt.user_id = User.id AND Attempt.test_id != 5'
            )
        )
    ),
    'contain' => array(
        (int) 0 => 'Resume',
        (int) 1 => 'Attempt',
        (int) 2 => 'Tag'
    ),
    'group' => 'User.id',
    'limit' => (int) 1,
    'fields' => array(
        (int) 0 => 'User.id',
        (int) 1 => 'Resume.id'
    )
)

返回的数据如下所示:

array(
    (int) 0 => array(
        'User' => array(
            'id' => '381'
        ),
        'Resume' => array(
            'id' => '15'
        ),
        'Attempt' => array(
            (int) 0 => array(
                'id' => '16072',
                'user_id' => '381',
                'test_id' => '8',
                'status' => 'complete'
            ),
            (int) 2 => array(
                'id' => '16073',
                'user_id' => '381',
                'test_id' => '8',
                'status' => 'complete'
            )

查询需要永远运行一天,我只需要 User.id,所以我试图去掉不需要的字段。它适用于 hasOne 关联,但 hasMany 与文档中的语法不匹配。例如,'limit'=>array('Attempt.id') 会抛出错误,因为没有 $user['Attempt']['id']。相反,它是 $user['Attempt'][#]['id']。

我该怎么做?我也很想听听任何其他可以加快查询速度的建议。

【问题讨论】:

【参考方案1】:

好的,这就是我要做的。

首先,我看到您只需要 User.id,但是我看到您在包含中添加了更多关联,因此我将删除“标签”。

我看到你正在做一个 left 类型的手动连接,这是 Cakephp 默认使用的,是的,我看到你在那里设置了一个附加条件,即使它没有任何问题我只是绑定 Attempt 模型在上述条件下即时运行,即

$this->User->unbindModel(array('hasMany' => array('Attempt'))); 
//I dont know if its a hasMany, I just assumed that
$this->User->bindMode(array('hasMany'=> array(
    'Attempt' => array('conditions' => array('Attempt.test_id <>' => 5)))));

使用 Resume 模型重复。

我看到你在分组,但我没有看到任何聚合函数,你为什么在里面分组?你需要什么?可以用 Hash::extrat() 解决吗?

另一件事是:直接在数据库控制台中运行查询,看看是否有索引可以帮助您。

最后,我不确定您的要求,但是否应该同时满足这两个条件(在尝试和恢复模型中)?如果是这种情况,那么您需要“内部连接”

【讨论】:

谢谢吉列尔莫。我应该澄清一下,即使此查询在 Tag 模型上没有任何条件,但其中许多条件都会。所以我无法摆脱它或任何关联。 好的,如果您告诉我们完整的条件集以及您对此查询的需求,我们可以更好地为您提供帮助。 这些是完整的条件集。我只需要获取 User.id。所有其他包含物只是过滤器。各种条件参考这些表格。 另外,我不知道为什么我必须公开“加入” Attempts 表。 hasMany 关联在模型中设置正确,但除非我手动 join 它,否则我会收到错误。 如果我在 where 条件或其他情况下使用一个,我会收到有关 CakePHP 无法从尝试表中识别字段名称的错误。

以上是关于CakePHP:当有多个关联记录时如何指定返回字段的主要内容,如果未能解决你的问题,请参考以下文章

在 CakePHP 中保存新的关联记录

CakePHP 模型关联 HasMany - 保存错误

CakePHP 3:上传多个文件并将文件名保存在关联模型中?

在 CakePHP 中保存时如何验证关联模型是不是存在

CakePHP - 如何一次通过记录保存单个 hasMany,每个 hasMany 有多个 belongsTo 记录?

在 SQLAlchemy 中,当有多个关系时,如何访问查询中的引用属性?