2015-05-20 18 views
0

Моя цель - получить все «элементы» пользователя и отобразить их в моем представлении, сгруппированных по их «статусу». Существует 4 возможных статуса, каждый со своим <div> на странице, содержащей информацию о товарах. Через некоторое ковыряться я считаю, что нужно использовать метод groupBy() как так:Как использовать groupBy() в Eloquent ORM для группировки коллекции

$items = Item::ownedBy(Auth::id())->groupBy('status')->get(); 

Это, кажется, делать какие-то группировки, но когда я итерацию по коллекции я получаю максимум 4 результатов, один для каждый статус. Это действительно не решает мою проблему, поскольку мне нужно отображать все элементы пользователя для каждого состояния, а не только одного. Мне здесь, должно быть, что-то не хватает, я бы очень хотел избежать запроса для каждого статуса и отображения их таким образом. Я полагаю, что я мог бы фильтровать коллекцию по статусу и создавать 4 новые коллекции, но разве это не должно делать groupBy()?

+0

SQL 'GROUP BY status 'объединяет все строки с одним и тем же« статусом »в одну строку, поэтому это не то, что вы хотите. – ceejayoz

+0

Спасибо @ceejayoz У меня было чувство, что я, возможно, иду по неправильному пути. Может быть, лучше будет фильтровать на 4 разных коллекций/массивов? –

ответ

1

Вы можете сделать это очень легко с laravel и Collections. Коллекции имеют мощный API и множество удобных методов, которые легко достигают того, что вы хотите.

Ваша ошибка заключается в том, что вы вызываете groupBy в объекте QueryBuilder, который возвращает только группу из записей из базы данных. Вместо этого вы должны выбрать все нужные вам записи, затем они будут возвращены в виде коллекции. После этого вы можете управлять коллекцией по своему усмотрению. Так что вам нужно:

$items = Item::ownedBy(Auth::id())->get()->groupBy('status'); 

Вы можете просмотреть все из класса полуботинки полезные методы here.

+0

Спасибо, что имеет смысл. Как я могу отобразить сгруппированные данные? Я не могу найти документацию о том, как использовать groupBy для группировки и отображения групп данных. –

+0

@JoshMountain Вы можете проверить [ссылку на класс] (http://laravel.com/api/master/Illuminate/Database/Eloquent/Collection.html#method_groupBy). groupBy возвращает объект коллекции, вы можете просто пропустить его, как массив. Вы можете var_dump коллекцию, чтобы просмотреть структуру. – shaddy