模特的cakephp力量指数

时间:2013-04-11 13:12:24

标签: php cakephp indexing cakephp-1.3

我在模型中使用了使用“FORCE INDEX”的find方法。模型很好,但是当我对该find方法进行测试时,发生了SQL错误。 我使用test / fixture并定义数据库架构和数据。在test / fixture中,我不知道如何定义索引。因此,DB for test没有索引。 如果你能告诉我如何在test / fixture中定义索引,那就太好了。

在模特......

$this->Model->find('all', array(
     'fields' => array('foo'),
     'conditions' => array('foo' => foo),
     'joins' => array('FORCE INDEX(foo)'),
);

在测试/夹具中

var $fields = array(
    'id' => ....
    'foo' => ....
    'created' => ....
    'modified' => ....
 );

1 个答案:

答案 0 :(得分:1)

我认为这会帮助你:

http://cakephp.1045679.n5.nabble.com/Using-USE-INDEX-or-FORCE-INDEX-in-Model-gt-find-amp-relationships-td3281552.html#a3300205

“1-创建我自己的数据源 - (在我的情况下扩展DboMysql) 数据源有两个任务:

它覆盖read方法并检查model是否设置了useIndex字段

    if (!empty($model->useIndex)) { 
            $this->useIndex = $model->useIndex; 
    } 

    return parent::read($model, $queryData); 

并覆盖renderStatement方法,如果设置了$ model-> useIndex字段,则在select语句中的表别名后添加其值。

if (strtolower($type) == 'select' && !empty($this->useIndex)) { 
        $res = "SELECT {$fields} FROM {$table} {$alias} {$this->useIndex} {$joins} {$conditions} {$group} {$order} {$limit}"; 
} else { 
        $res = parent::renderStatement($type, $data); 
} 
$this->useIndex = null; 
return $res; 

2-设置模型字段whitch包含sql部分使用索引,强制索引或忽略索引

例如在控制器中:

$this->Task->useIndex = 'IGNORE INDEX(ind_usr_id)'; 
$this->paginate = array( 
        'fields' => array('Task.id', 'Task.name','User.id', 'User.name'), 
        'order' => 'Task.id', 
        'limit' => 10 
); 
$this->paginate('Task');