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

时间:2013-11-26 18:51:56

标签: php cakephp join cakephp-2.0 query-optimization

我正在使用一组相当复杂的条件进行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 个答案:

答案 0 :(得分:0)

好的,这就是我要做的事。

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

我看到你正在进行左手类型的手动连接,这是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 :: \ textrat()来解决吗?

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

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