Я использую метод 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' => .... );
я думаю, что я помогу u:
«Создание собственного источника данных (в моем случае расширение DboMysql) имеет два задания:
его метод считывания переопределений и проверки, если модель установила поле useIndex
if (!empty($model->useIndex)) { $this->useIndex = $model->useIndex; } return parent::read($model, $queryData);
и он переопределяет метод renderStatement, и если было задано поле $ model-> useIndex, добавив его значение после псевдонима таблицы в select statement.
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');
"