我处在一种情况,我需要执行一些非常大的查询,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"
)
)
答案 0 :(得分:1)
答案 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而不是表名相关联。