所以我试图使用'Product'的id作为每个Product的索引键返回一个find'all'数组。
通常会返回:
array(
(int) 0 => array(
'Product' => array(
'id' => '1232',
'category_id' => '330',
'name' => 'Product #1',
)
),
(int) 1 => array(
'Product' => array(
'id' => '1245',
'category_id' => '310',
'name' => 'Product #2',
)
),
(int) 2 => array(
'Product' => array(
'id' => '1248',
'category_id' => '312',
'name' => 'Product #3',
)
)
)
理想情况下我希望它返回:
array(
(int) 1232 => array(
'Product' => array(
'id' => '1232',
'category_id' => '330',
'name' => 'Product #1',
)
),
(int) 1245 => array(
'Product' => array(
'id' => '1245',
'category_id' => '310',
'name' => 'Product #2',
)
),
(int) 1248 => array(
'Product' => array(
'id' => '1248',
'category_id' => '312',
'name' => 'Product #3',
)
)
)
这可能吗?我该怎么做呢?
我有一个excel电子表格记录,我需要将其与ID匹配,所以目前我让它迭代每个电子表格行并执行“第一次”查找以获得任何结果,然后如果他们这样做就采取行动。
它有效,但记录集已经增长到超过28000,因此为每个记录集执行一次查找会产生明显的开销。
如果我只是在“查找”操作中就可以做到这一点,那将会很棒,如果没有,那么任何明显的性能提升都会受到赞赏。
答案 0 :(得分:6)
您可以在找到所有内容后获得此结果:
$result = Hash::combine($data, '{n}.Product.id', '{n}.Product');
其中$ data是find all的结果。
答案 1 :(得分:6)
您可以在AppModel中扩展您的find方法,就像这样
public function find($type = 'first', $query = array()) {
switch($type) {
case 'keysid':
if($results = parent::find('all', $query)){
if(isset($results[0][$this->alias]['id'])){
return Hash::combine($results, '{n}.'.$this->alias.'.id', '{n}');
}else{
return $results;
}
}
break;
default:
return parent::find($type, $query);
break;
}
}
然后你可以按如下方式调用你的find方法:
$this->Product->find('keysid');
然后您将拥有指定的结果数组。但是,如果需要一行代码,也可以使用一行代码执行此操作。假设$ products是find('all')
中的数组if($products = $this->Product->find('all')){
$alteredProducts = Hash::combine($products, '{n}.Product.id', '{n}');
}
查看Hash实用程序