CakePHP: огромное количество вызовов SELECT count(*)

CakePHP делает этот точный запрос три раза:

SELECT COUNT(*) AS `count` FROM `mydb`.`players` AS `Player` WHERE `Player`.`id` = 8

Когда я бегу:

$this->Player->id = $player_id;
$this->Player->save($save_array);

Кажется, CakePHP делает это, чтобы проверить, должна ли Model->save() быть записью создания или обновления. Я изучил проблему и попытался реализовать следующее:

Заставить CakePHP выполнить обновление, указав ключ ID в saveFields . Я подумал, что не нужно было бы делать COUNT(*), если бы он знал, что нужно обновлять каждый раз. Вот моя настоящая цель: что-то вроде updateAll, которое работает как save(). Предположим, что updateAll также не делает это COUNT(*).

Пользовательская разбивка на страницы, либо я сделал это неправильно, либо проблема не в этом.

Изменение model.php(!) был опасен и в конечном итоге не увенчался успехом.

Я просто хочу иметь другую функцию, такую ​​как save(), которая просто обновляется, чтобы я мог избавиться от этих COUNT(*) запросов, но я не уверен, что CakePHP поддерживает такую ​​вещь.


person Vael Victus    schedule 07.03.2016    source источник


Ответы (1)


Вызовы исходят от функции Model::exists() в модели. Вы можете переопределить эту функцию в своей AppModel или любой другой модели, где вам нужно предотвратить это и локально кэшировать результат функции.

Например, если он получает id = 8 в этой функции, у вас может быть массив, помнящий, что этот идентификатор уже существует.

person José Lorenzo Rodríguez    schedule 16.03.2016
comment
Большое спасибо! Я заменил возврат (bool) find простым возвратом true, потому что кажется, что если я просто укажу идентификатор, он уже должен знать, что запись существует. Пока я не вижу проблем с созданием или обновлением каких-либо записей. Вы знаете, почему Cake хочет сделать здесь count()? Это кажется совершенно расточительным, если я явно не хочу использовать разбиение на страницы. - person Vael Victus; 18.03.2016
comment
Он решает, делать ли вставку или обновление. Бывают случаи, когда вы хотите вставить запись в базу данных с заданным идентификатором. - person José Lorenzo Rodríguez; 18.03.2016
comment
Для всех, кто хочет быстрого решения этой проблемы, вот мой код: beetxt.com/8fT - person Vael Victus; 18.03.2016