阻止CakePHP 3列出它使用find()生成的SELECT查询中的所有字段

时间:2018-05-25 11:55:54

标签: mysql cakephp cakephp-3.0

我正在尝试优化大型MySQL查询。我偶然发现列出所有字段的查询(SELECT Orders.id AS Orders__id, <...>;默认的CakePHP行为)比仅查SELECT * FROM的查询要长4倍 - 0.324秒对0.084秒;多次检查。

我想知道我是否可以禁用此行为。我试过了:

  • 'fields' => '*'添加到find()选项或调用->select('*'),但会导致SELECT Orders.* AS Orders__*抛出SQLSTATE [42000]错误。

  • 根据query-builder.html#selecting-data使用->select(['*' => '*'])删除别名标题,但这导致SELECT * AS *也会引发错误

  • 使用->enableAutoFields(false)

我也试过谷歌,但我甚至不知道怎么称呼这个

2 个答案:

答案 0 :(得分:1)

您似乎想要覆盖ORM的好处,因此我将建议一种不应在正常操作中使用的方法。

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

如果你想保湿实体,你必须允许select语句为这些字段设置别名,这样上面的内容就不会给你实体。

我的意见是你应该使用正常的选择并优化你的缓存策略。

答案 1 :(得分:0)

显然,由于CakePHP ORM的设计方式,我无法

相反,由manually whitelisting only the fields I actually need解决。毕竟查询仍然相对较快(大约100毫秒。根据我的测量结果)。