Частенько бывает так, что в том же яваскрипте мы, чтобы избежать двойных переборов, должны точно попадать на необходимые нам индексы массива. Для этого каждый раз приходится перестраивать массивы перед выдачей их в response.
Предлагаю ввести в waModel параметр
protected $id2index = false;
Т.к. мы всегда можем указать в модели какое из полей таблицы является индексным, то, в сочетании с этим параметром, мы всегда сможем получить на выходе массив с индексами таблицы в качестве индексов массива. Это экономически более выгодно т.к. перед выдачей нам результатов массив все равно перебирается, и подменить в нем индексы будет не сложно.
Т.к. параметр по умолчанию false, то это никак не повлияет на совместимость с уже написанным кодом, но даст удобный инструмент для будущих разработок.
6 комментариев
Поддерживаю.
Либо так, либо каким-то другим способом.
Может я, конечно, неправильно ваc понял, но:
$model->getAll('field') - вернёт массив с ключами поля field
$model->getByField('somefield', 'somevalue', 'field') - вернёт массив с ключами поля field
Внутри модели:
$model->query($sql)->fetchAll('field') - вернёт массив с ключами поля field
Сейчас пока нет возможности детально протестировать, но обычно мы получаем массивы с индексами 0, 1, 2, 3,...
Внутри этого массива у нас допустим почти всегда id, name,...
Допустим мы получили такой массив:
Но удобней было бы получить вот такой массив:
Это не всегда нужно и иногда может привести к склеиванию некоторых записей в сложных выборках, поэтому лучше сделать это опциональным.
Значит я вас понял правильно, используйте то, что я написал выше.
Это очень много где в коде Shop-Script используется...
Офигенно!
А я пересобираю массивы... Буду знать. Спасибо.
Если ты для js такую выборку делаешь, то лучше не надо. В массиве js индексы всегда идут подряд и от нуля. Есть вероятность, довольно большая, что числовые ключи будут потеряны при json_encode результата выборки -- оно превратит php-массив с числовыми ключами в json-массив, а не объект. Конечно, можно передавать опцию JSON_FORCE_OBJECT, но потеряешь совместимость с 5.2