阻止CakePHP 3列出它使用find()生成的SELECT查询中的所有字段 [英] Stop CakePHP 3 from listing all fields in the SELECT query it generates with find()
问题描述
我正在尝试优化大型MySQL查询。我意外地发现,列出所有字段的查询( SELECT Orders.id AS Orders__id,< ...>
;默认的CakePHP行为)所花的时间是原来的4倍只需 SELECT * FROM
的查询-0.324秒对0.084秒;检查了几次。
I'm trying to optimise a large MySQL query. I accidentally found out that a query with all fields listed (SELECT Orders.id AS Orders__id, <...>
; the default CakePHP behaviour) takes 4 times longer compared to a query with just SELECT * FROM
- 0.324 seconds vs. 0.084 seconds; checked several times.
我想知道是否可以禁用此行为。我尝试过:
I'm wondering if I can disable this behaviour. I've tried:
-
添加
fields => '*'
到find()
选项或调用-> select('*')
,但会生成SELECT订单。* AS订单__ *
会引发SQLSTATE [42000]错误。
adding
'fields' => '*'
to thefind()
options or calling->select('*')
, but it results inSELECT Orders.* AS Orders__*
which throws an SQLSTATE[42000] error.
使用-> select(['*'=>'*'])
根据 query-builder.html#selecting-data ,但是导致 SELECT * AS *
也会引发错误
getting rid of the aliased title with ->select(['*' => '*'])
as per query-builder.html#selecting-data, but that results in SELECT * AS *
which also throws an error
使用- > enableAutoFields(false)
我也尝试使用Google,但我没有甚至不知道该怎么称呼
I also tried to Google but I don't even know how to call this
推荐答案
显然,我不能 not 列出这些字段,因为CakePHP ORM的设计方式。
Apparently, I can't not have the fields listed because of how CakePHP ORM was designed.
因此,由手动将我真正需要的字段列入白名单一个>。毕竟查询仍然相对较快(根据我的测量,大约是100毫秒)。
So instead, solved by manually whitelisting only the fields I actually need. The query is still relatively fast after all (around 100 ms. according to my measurements).
这篇关于阻止CakePHP 3列出它使用find()生成的SELECT查询中的所有字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!