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

问题描述 投票:0回答:3

因此,我尝试使用“产品”的 id 作为每个产品的索引键来返回查找“全部”数组。

通常它返回:

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 个,因此为每个记录集执行一次查找会产生明显的开销。

如果我可以简单地在“查找”操作中做到这一点,那就太好了,如果不能,性能的任何显着提高将不胜感激。

php arrays cakephp data-structures find
3个回答
6
投票

找到全部后你可以得到这个结果:

$result = Hash::combine($data, '{n}.Product.id', '{n}.Product');

其中$data是find all的结果。


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 实用程序


0
投票

使用

indexBy()

$articles = $this->Articles->find('all')
    // optional conditions etc.
    //->where(['Users.id' => $identity->get('id')])
    ->all()
    ->indexBy('id')
    ->toArray();
© www.soinside.com 2019 - 2024. All rights reserved.