TableAlias__ColumnAlias虚拟字段中的语法未按文档解析

时间:2017-03-23 11:57:11

标签: cakephp cakephp-2.9

Docs声明我们可以使用类似Timelog__TotalHours的语法命名计算字段,PHP会将其解析为:

[0] => Array
(
    [ProductsItems] => Array
        (
            [Total] => 50
    )
)

在我的CakePHP / 2.9.4设置中,我在几个地方尝试它,例如pagination,但是我将列名称作为任何其他字符串处理:

[0] => Array
(
    [ProductsItems__Total] => 50
)

我在控制器中的测试代码是:

$this->Paginator = $this->Components->load(
    'Paginator',
    array(
        'fields' => array(
            "CONCAT_WS(' ', Usuario.nombre, Usuario.apellidos) AS Usuario__Empleado",
        ),
        'contain' => array(
            'Usuario',
        ),
        'limit' => 2,
    )
);
debug($this->Paginator->paginate());

...并打印:

array(
    (int) 0 => array(
        (int) 0 => array(
            'Usuario__Empleado' => 'Juan García'
        ),
        'Usuario' => array(
            'id' => '56'
        )
    ),
    (int) 1 => array(
        (int) 0 => array(
            'Usuario__Empleado' => 'María López'
        ),
        'Usuario' => array(
            'id' => '385'
        )
    )
)

我是否需要明确在某处启用此功能?

1 个答案:

答案 0 :(得分:3)

首先,您应该在查询之前定义虚拟字段(可以是模型或控制器)。

$this->CurrentModel->Usuario->virtualFields['Empleado'] = 0;
$this->Paginator = $this->Components->load(
    'Paginator',
    array(
        'fields' => array(
            "CONCAT_WS(' ', Usuario.nombre, Usuario.apellidos) AS Usuario__Empleado",
        ),
        'contain' => array(
            'Usuario',
        ),
        'limit' => 2,
    )
);
debug($this->Paginator->paginate());

它应该有用。