CakePHP使用'id'作为数组索引返回find('all')

sne*_*exz 4 php arrays cakephp find data-structures

所以我试图使用'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',
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望它返回:

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',
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

这可能吗?我该怎么做呢?

我有一个excel电子表格记录,我需要匹配ID,所以目前我已经迭代每个电子表格行并执行"第一次"查找以获得任何结果,然后如果他们这样做则采取行动.

它的工作原理,但记录集已经增长到超过28000,因此每个执行一个发现都有明显的开销.

如果我只是在"查找"操作中可以做到这一点,那将是很好的,如果没有,任何明显的性能提升都会受到赞赏.

小智 6

找到所有后你可以得到这个结果:

$result = Hash::combine($data, '{n}.Product.id', '{n}.Product');
Run Code Online (Sandbox Code Playgroud)

其中$ data是查找全部的结果.


小智 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

之后您可以按如下方式调用find方法:

$this->Product->find('keysid');
Run Code Online (Sandbox Code Playgroud)

然后,您将获得指定的结果数组.但是,如果需要一行代码,也可以使用一行代码执行此操作.假设$ products是你的数组('all')

if($products = $this->Product->find('all')){
        $alteredProducts = Hash::combine($products, '{n}.Product.id', '{n}');
    }
Run Code Online (Sandbox Code Playgroud)

看看Hash实用程序