在 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()?

调用未定义的方法 Cake\ORM\Entity::query() CakePhp

CakePHP 3 - 使用多个数据库连接*不使用ORM *