2014-11-11 4 views
28

Когда я выполняю запрос через Eloquent ORM Laravel, я хочу получить идентификатор строки в качестве ключевого результата массива, это упростит, когда я хочу проверить что-то на основе ID (с использованием array_key_exists) или сделать некоторые поисковые запросы (если мне нужна конкретная запись из массива результатов)Laravel Eloquent: Return Array key как поля ID

Есть ли способ, которым я могу сказать Eloquent, чтобы установить ключ в ID полей? see image http://oi60.tinypic.com/kc02a8.jpg

+0

петля результаты и креа т. е. новый массив? – itachi

+0

Мысль об этом, но я подумал, что должен быть способ сделать это через красноречивый ...: -/ – Broshi

+0

Я должен согласиться, что вам придется делать это самостоятельно. В качестве альтернативы вы можете использовать '-> find ($ id)' в коллекции, чтобы найти модель по id ... – lukasgeiter

ответ

5

У вас есть Support\Collection/Database\Eloquent\Collection вы можете использовать метод lists('id') вернуть массив ид каждой из моделей в коллекции.

Затем используйте array_combine, чтобы отобразить ключи к моделям. Результатом этого будет массив с идентификатором, сопоставленным с соответствующей моделью.

27

Поскольку у вас есть Красноречивая коллекция (child class of generic Collection class), вы можете использовать getDictionary method. $collection->getDictionary() предоставит вам массив объектов категории, связанных их первичными ключами.

Если вам нужна другая коллекция, а не собственный PHP-массив, вместо этого вы можете использовать $collection->keyBy($property). Похоже, ваш первичный ключ category_id, поэтому $collection->keyBy('category_id'). Вы можете использовать этот метод для ключа любым произвольным свойством, включая любые мутаторы get, которые вы, возможно, написали.

Хотя getDictionary является уникальным для Collection расширения красноречив, keyBy доступен всем Laravel Collection объектов. См. Laravel 4.2 API docs или Laravel 5.0 API docs.

1

Если вам нужен идентификатор в качестве ключа, а затем полагаться на Коллекция:

$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); 
45

Вы можете просто сделать

Model::all()->keyBy('category_id'); 

Cheers :)

+0

Это должно быть перенесено на верхний ответ! – Bassem