阻止 CakePHP 3 列出它使用 find() 生成的 SELECT 查询中的所有字段
Stop CakePHP 3 from listing all fields in the SELECT query it generates with find()
我正在尝试优化大型 MySQL 查询。我无意中发现,与仅列出 SELECT * FROM
的查询相比,包含所有字段的查询(SELECT Orders.id AS Orders__id, <...>
;默认的 CakePHP 行为)需要 4 倍的时间 - 0.324 秒对 0.084 秒;检查了几次。
我想知道我是否可以禁用此行为。我试过:
将 'fields' => '*'
添加到 find()
选项或调用 ->select('*')
,但会导致 SELECT Orders.* AS Orders__*
,从而引发 SQLSTATE[42000] 错误。
根据 query-builder.html#selecting-data 删除带有 ->select(['*' => '*'])
的别名标题,但这会导致 SELECT * AS *
,这也会引发错误
使用->enableAutoFields(false)
我也试过Google但我什至不知道怎么称呼这个
您似乎想要覆盖 ORM 的好处,所以我将建议一种不应在正常操作中使用的方法。
$datasource = ConnectionManager::get('default');
$datasource->execute('SELECT * FROM some_table;');
如果您想混合实体,您必须允许 select 语句为字段设置别名,这样上面的内容就不会为您提供实体。
我的意见是您应该使用正常的 select 并针对这些数据优化您的缓存策略。
显然,由于 CakePHP ORM 的设计方式,我无法不列出字段。
因此,由 manually whitelisting only the fields I actually need 解决。毕竟查询还是比较快的(据我测量大约100ms)。
我正在尝试优化大型 MySQL 查询。我无意中发现,与仅列出 SELECT * FROM
的查询相比,包含所有字段的查询(SELECT Orders.id AS Orders__id, <...>
;默认的 CakePHP 行为)需要 4 倍的时间 - 0.324 秒对 0.084 秒;检查了几次。
我想知道我是否可以禁用此行为。我试过:
将
'fields' => '*'
添加到find()
选项或调用->select('*')
,但会导致SELECT Orders.* AS Orders__*
,从而引发 SQLSTATE[42000] 错误。根据 query-builder.html#selecting-data 删除带有
->select(['*' => '*'])
的别名标题,但这会导致SELECT * AS *
,这也会引发错误使用
->enableAutoFields(false)
我也试过Google但我什至不知道怎么称呼这个
您似乎想要覆盖 ORM 的好处,所以我将建议一种不应在正常操作中使用的方法。
$datasource = ConnectionManager::get('default');
$datasource->execute('SELECT * FROM some_table;');
如果您想混合实体,您必须允许 select 语句为字段设置别名,这样上面的内容就不会为您提供实体。
我的意见是您应该使用正常的 select 并针对这些数据优化您的缓存策略。
显然,由于 CakePHP ORM 的设计方式,我无法不列出字段。
因此,由 manually whitelisting only the fields I actually need 解决。毕竟查询还是比较快的(据我测量大约100ms)。