Запретить CakePHP 3 перечислить все поля в запросе SELECT, который он генерирует с помощью find ()

Я пытаюсь оптимизировать большой запрос MySQL. Я случайно обнаружил, что запрос со всеми перечисленными полями (SELECT Orders.id AS Orders__id, <...>; поведение CakePHP по умолчанию) занимает в 4 раза больше времени по сравнению с запросом только с SELECT * FROM - 0,324 секунды против 0,084 секунды; проверял несколько раз.

Мне интересно, могу ли я отключить это поведение. Я пытался:

  • добавление 'fields' => '*' к параметрам find() или вызов ->select('*'), но это приводит к SELECT Orders.* AS Orders__*, который вызывает ошибку SQLSTATE [42000].

  • избавление от названия с псевдонимом с помощью ->select(['*' => '*']) согласно query-builder.html # selection-data, но это приводит к SELECT * AS *, который также вызывает ошибку

  • с использованием ->enableAutoFields(false)

Я тоже пробовал гуглить, но даже не знаю, как это назвать

так что именно ты хочешь?

Antoniossss 25.05.2018 14:17

Я хочу, чтобы сгенерированный запрос был просто SELECT * FROM <...>, а не перечислял все поля, которые он собирается выбрать

aexl 25.05.2018 14:19

Но вы не сможете увлажнить результаты

Antoniossss 25.05.2018 14:25

Я думаю, что вы неправильно измерили время запроса. без очистки кеша и т. д.

Antoniossss 25.05.2018 14:36

Вы действительно уверены в потраченном времени? Как вы это измерили?

ndm 25.05.2018 14:36

@Antoniossss опередил меня ...

ndm 25.05.2018 14:37

@ndm получил его из MySQL Workbench "Action Output" i.imgur.com/KerEgJC.png, вы думаете, это неточно?

aexl 25.05.2018 15:01
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
7
131
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, вы хотите переопределить преимущества ORM, поэтому я собираюсь предложить метод, который не следует использовать в обычных операциях.

$datasource = ConnectionManager::get('default');
$datasource->execute('SELECT * FROM some_table;');

Если вы хотите гидратировать сущности, вы должны разрешить оператору select использовать псевдонимы для полей, чтобы приведенное выше не давало вам сущностей.

Я считаю, что вы должны использовать обычный выбор и оптимизировать свои стратегии кеширования для этих данных.

В этом запросе я использую конструкцию containмного, поэтому прямой ввод SQL не очень эффективен. Однако это может быть вариант для кого-то другого. Спасибо, проголосовали за. Кстати, добро пожаловать в клуб 1К хаха :)

aexl 28.05.2018 10:41
Ответ принят как подходящий

По-видимому, я не могу иметь перечисленные поля в нет из-за того, как был разработан CakePHP ORM.

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

Другие вопросы по теме