2013-04-11 2 views
1

Я использую метод find, который использует «FORCE INDEX» в модели. Модель прекрасна, но когда я делаю тест для этого метода поиска, произошла ошибка SQL. Я использую test/fixture и определяю схему и данные DB. В тесте/приборе я не знаю, как определить индекс. Поэтому для теста БД не было индекса. Было бы здорово, если бы вы могли показать мне, как определить индекс в 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

я думаю, что помогу и:

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

«1- Создать свой собственный источник данных - (в моем случае расширение DboMysql) источник данных имеет две задачи:

его переопределяет метод и проверяет, читать, если модель установлена ​​useIndex полю

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

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

и переопределяет метод renderStatement и если $ модели-> useIndex поле было установлено, добавив его значение после таблицы псевдонимов в операторе отбора.

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- Настройка модели поле содержит 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'); 

"

+0

Спасибо за ваш ответ . Я добавляю в свой запрос test.php «this this-> Model-> (« ALTER TABLE tbl ADD INDEX index (foo); '); ». Он отлично работает !! Спасибо! – user2270371

+0

@ user2270371, если этот ответ работает на вас, пожалуйста, «примите» его, чтобы отметить свой вопрос «ответили» – thaJeztah

Смежные вопросы