阻止CakePHP 3列出它使用find()生成的SELECT查询中的所有字段 [英] Stop CakePHP 3 from listing all fields in the SELECT query it generates with find()

查看:71
本文介绍了阻止CakePHP 3列出它使用find()生成的SELECT查询中的所有字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试优化大型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 the find() options or calling ->select('*'), but it results in SELECT 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆