Ответ 1
Вы можете просто сделать
Model::all()->keyBy('category_id');
Ура :)
Когда я выполняю запрос с помощью Laravel Eloquent ORM, я хочу получить идентификатор строки в качестве ключа результата Array, это облегчит задачу, когда я захочу проверить что-либо на основе идентификатора (используя array_key_exists) или сделать некоторые поиски (если я нужна конкретная запись из массива результатов)
Можно ли как-то сказать Eloquent установить ключ для идентификатора поля?
Вы можете просто сделать
Model::all()->keyBy('category_id');
Ура :)
Поскольку у вас есть Eloquent Collection (дочерний класс класса общий Collection
), вы может использовать метод getDictionary
. $collection->getDictionary()
предоставит вам массив объектов категории, связанных их первичными ключами.
Если вам нужна другая коллекция, а не собственный PHP-массив, вместо этого вы можете использовать $collection->keyBy($property)
. Похоже, ваш первичный ключ category_id
, поэтому $collection->keyBy('category_id')
. Вы можете использовать этот метод для ключа любым произвольным свойством, включая любые мутаторы get, которые вы, возможно, написали.
Хотя getDictionary
уникален для расширения Eloquent Collection
, keyBy
доступен для всех объектов Laravel Collection
. См. Laravel 4.2 API docs или Документы API Laravel 5.0.
У вас есть Support\Collection
/Database\Eloquent\Collection
, вы можете использовать метод lists('id')
, чтобы вернуть массив идентификатора каждой из моделей в коллекции.
Затем используйте array_combine
для сопоставления клавиш с моделями. Результатом этого будет массив с идентификатором, сопоставленным с соответствующей моделью.
Если вам нужен идентификатор в качестве ключа, то полагайтесь на Collection:
$collection = Model::all();
$collection->getDictionary();
// returns:
array(
1 => object(Model) ( ... ),
2 => object(Model) ( ... ),
...
idN => object(Model) ( ... )
);
В противном случае, хорошо или нет, вы можете сделать это:
$keys = $collection->lists('columnName');
$arrayOfModels = array_combine($keys, $collection->getDictionary);
pluck('label','id')
на выходе get() - это то, что вы ищете в Laravel 5. 8+, который дает вам коллекцию, готовую к toArray()
ed
например:
$options = \App\DataChoice::where([ 'field_id' => $dataField->id , 'active' => true ])->get()->pluck('label','id')->toArray();
У меня была похожая проблема - я хотел создать массив PHP, который позволял бы мне создавать a с каждым для выбора, со значением, являющимся столбцом автоинкремента id, и отображаемым текстом, являющимся значением.