在 CakePHP 2.x ORM + 中使用函数 MySQL 和 NameClass 模型删除 ;(
Posted
技术标签:
【中文标题】在 CakePHP 2.x ORM + 中使用函数 MySQL 和 NameClass 模型删除 ;(【英文标题】:In CakePHP 2.x ORM + use Function MySQL AND NameClass Models remove ;( 【发布时间】:2015-07-07 23:45:21 【问题描述】:问题,如何制作 ORM Cakephp,不要浪费我的表名或类,当一个 mysql 函数如 SUM() "sum(SenasaPedidosDetalles.kg_reales) total_kg_reales" 着火时。
示例代码在:
打印:http://s25.postimg.org/7z1fiwpyn/Print_de_pantalla_612.jpg
示例数据输出:
打印:http://s25.postimg.org/ahn4jlbov/Print_de_pantalla_614.jpg
CakePHP 2.x 解决这个问题的最佳方法是什么?
【问题讨论】:
【参考方案1】:编辑: 正如 AgRizzo 在评论部分所指出的,您应该在需要时创建虚拟字段:
$this->Model->virtualFields['total_kg_reales'] = 'SUM(Model.kg_reales)';
$this->Model->find(...) ;
您可以使用虚拟字段(在您的模型中):
public $virtualFields = array(
'total_kg_reales' => 'SUM(SenasaPedidosDetalles.kg_reales)'
);
如果你想处理模型别名(见http://book.cakephp.org/2.0/en/models/virtual-fields.html):
public function __construct($id = false, $table = null, $ds = null)
parent::__construct($id, $table, $ds);
$this->virtualFields['total_kg_reales'] = sprintf(
'SUM(%s.kg_reales)', $this->alias
);
【讨论】:
好答案。在构造函数中设置虚拟字段通常是最好的,这样可以正确处理别名,如图所示。我经常发现通过直接分配虚拟字段属性来假设别名是有问题的。 当它是聚合 SQL 函数(MIN、MAX、SUM、AVG)时,我认为您应该在构造函数中创建虚拟字段。我的推理(因为我现在无法测试):除非每个 SQL 查询(即在此模型上执行find
)都有 GROUP BY
,否则 find
将只返回 1 行。 tl;dr 我认为您想在 find
之前创建虚拟字段
@AgRizzo 你可能是对的(我也无法测试它)。我暂时更新了我的帖子(稍后我会检查详细信息)。以上是关于在 CakePHP 2.x ORM + 中使用函数 MySQL 和 NameClass 模型删除 ;(的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 CakePHP3 ORM 获取字符串格式的 where 子句?
CakePHP 3.0 ORM - 调试工作,翻转直播,抛出错误
为啥使用 Doctrine 而不是 CakePHP 的标准数据库 ORM?
CakePHP 3.x ORM get()、find() 以及如何禁用befeoreFind()?