Есть ли какая-либо функция CakePHP, которая создает и выполняет запрос, не возвращая результирующий набор

Я использую CakePHP 2.1.3. У меня проблема с производительностью зацикливания большого набора данных массива, возвращаемых из find('all'). Я хочу получать результаты запроса строка за строкой, чтобы исключить эту дорогостоящую обработку массива. Я не хочу, чтобы набор результатов возвращался из find() или же query(). То, что я пытаюсь сделать, это как показано ниже:

$db = $this->Model->getDataSource();

$sql = 'SELECT * FROM my_table';
if($result = $db->execute($sql){
$db->resultSet($result);
while($row = $db->fetchResult()){
// do something with $row
}
}

Однако я не хочу писать необработанный запрос. Есть ли какая-нибудь функция Cake, которая просто строит запрос в соответствии с набором ассоциаций и выполняет его без возврата набора результатов?

[Редактировать]

В настоящее время я реализую вышеуказанный скрипт в контроллере. Моя модель не имеет ассоциаций, поэтому мне не нужно использовать recursive = -1, Это целая таблица, извлекаемая для экспорта в CSV.

Торт find() имеет внутреннюю обработку массива, и возвращаемый набор результатов должен быть снова явно зациклен. Я хочу оптимизировать код, избегая обработки массивов больших данных дважды.

Связанная проблема: https://github.com/cakephp/cakephp/issues/6426

0

Решение

Сначала убедитесь, что вы получаете только те данные, которые вам действительно нужны. В идеале вы получаете все, что вам нужно, с помощью $ this-> YourModel-> recursive = -1
Часто проблемы с производительностью возникают из-за большого количества подключенных данных.

Когда вы проверили это, я думаю, что цикл будет лучшим решением, когда вы извлекаете нужные данные в виде фрагментов через условие между ними. Хотя я не уверен, поможет ли это вам.

Почему вы хотите пройти через всю таблицу? Вы выполняете какое-то обслуживание, например, заполнение нового поля или обновление счетчика? Может быть, вы можете достичь цели лучше, чем пытаться получить целую таблицу.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]