从cakephp查询获取结果为单维数组

时间:2012-10-11 05:58:24

标签: php cakephp cakephp-2.1

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

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

说我在模型中的代码就像:

$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"
        )
)

3 个答案:

答案 0 :(得分:1)

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

如果你不能这样做,那么你需要迭代你的结果并将它们变成你想要的格式。我想你会发现Set class非常有用。

答案 1 :(得分: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'
)

双重下划线__非常重要!另请参阅Sub-queries主题。

答案 2 :(得分: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)

所以如果列名包含一个virtualfieldseparator,默认情况下__该列将与索引0而不是表名相关联。