5

我的情况是,我需要执行一些非常大的查询,25~30 个连接来生成一些定期报告。

现在我们已经创建并运行了这些查询,我只想重用它们并因此使用蛋糕模型的查询方法。

说我在模型中的代码是这样的:

$this->query(
    'select emp.name,mngr.designation 
     from employee emp,manager mngr 
     where manager.emp_id=emp.id'
)

我回来的结果是这样的:

Array
(
    [0] => Array
        (
            [emp] => Array
            (
                [name] => "Tom"
            )
            [mngr] => Array
            (
                [designation] => "Developer"
            )
        )
    [1] => Array
        (
            [emp] => Array
            (
                [name] => "Thomas"
            )
            [mngr] => Array
            (
                [designation] => "Developer Manager"
            )
        )
)

有没有办法我可以从 cakephp 结果集中得到以下简单的 vanila 结构

Array
(
    [0] => Array
        (
            [0]=>"Tom"
            [1]=>"Developer"
        )
    [1] => Array
        (
            [0]=>"Thomas"
            [1]=>"Developer Manager"
        )
)

或仅在列级别但不在表级别的关联

Array
(
    [0] => Array
        (
            [name]=>"Tom"
            [designation]=>"Developer"
        )
    [1] => Array
        (
            [name]=>"Thomas"
            [designation]=>"Developer Manager"
        )
)
4

3 回答 3

1

您可以通过这种方式使用别名来获得类似的东西:

$this->query(
    'select emp.name AS emp__name, mngr.designation AS mngr__destination 
     from employee emp,manager mngr 
     where manager.emp_id=emp.id'
)

双下划线__很重要!还可以查看子查询主题。

于 2012-10-11T13:37:54.523 回答
1

将您的查询编写为视图并创建一个蛋糕模型,其“表”是该视图。

如果你不能这样做,那么你只需要迭代你的结果并将它们转换成你想要的格式。我想你会发现Set 类在这里很有帮助。

于 2012-10-11T06:27:44.173 回答
1

在深入挖掘 Cake 框架的 MySql.php 文件时,有一个方法 resultSet 可以完成所有映射/关联。

public function resultSet($results) {
    $this->map = array();
    $numFields = $results->columnCount();
    $index = 0;

    while ($numFields-- > 0) {
        $column = $results->getColumnMeta($index);
        if (empty($column['native_type'])) {
            $type = ($column['len'] == 1) ? 'boolean' : 'string';
        } else {
            $type = $column['native_type'];
        }
        if (!empty($column['table']) && strpos($column['name'], $this->virtualFieldSeparator) === false) {
            $this->map[$index++] = array($column['table'], $column['name'], $type);
        } else {
            $this->map[$index++] = array(0, $column['name'], $type);
        }
    }
}

这里要注意的声明是

if (!empty($column['table']) && strpos($column['name'], $this->virtualFieldSeparator) === false)

因此,如果列名包含一个默认为 __ 的虚拟字段分隔符,该列将与索引 0 而不是表名相关联。

于 2012-10-11T15:20:27.243 回答