CakePHP возвращает find (‘all’), используя ‘id’ в качестве индекса массива

Поэтому я пытаюсь вернуть массив find ‘all’, используя идентификатор «Product» в качестве ключа индекса для каждого Product.

Обычно это возвращает:

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, которой нужно сопоставить идентификаторы, поэтому в настоящее время она выполняет итерацию каждой строки таблицы и выполняет «первое» обнаружение, чтобы получить какие-либо результаты, а затем воздействовать на них, если они это делают.

Это работает, но набор записей вырос до более чем 28000, и поэтому выполнение одной находки для каждого имеет заметные накладные расходы.

Если бы я мог сделать это просто в операции «найти», было бы здорово, если бы не было заметного увеличения производительности.

3

Решение

Вы можете получить этот результат, как после найти все:

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

Где $ data — результат поиска всех.

6

Другие решения

Вы можете расширить свой метод поиска в AppModel следующим образом

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}');
}

Посмотрите на гашиш полезность

5