#php #laravel #eloquent
#php #laravel #красноречивый
Вопрос:
У меня есть таблица с именем item
, которая имеет отношение belongsTo к таблице с именем source
. Я хочу сгруппировать все элементы по их источнику, и в конце я хочу массив, который имеет source->name
в качестве ключа и количество связанных элементов в качестве значения.
Это то, что у меня пока есть:
Item::where('type', '=', Item::TYPE_POST)
->with('source')
->select('source_id', DB::raw('count(*) as total'))
->groupBy('source_id')
->pluck('total', 'source_id')
->all();
array:1 [
89 => 149
]
Это дает мне структуру, которую я хочу, но элементы группируются не по source->name
, а по source_id
, которое является полем в Item
таблице. Есть ли способ сделать так, чтобы ключ в массиве был полем из связанной таблицы?
Ответ №1:
Я не пробовал это, но в любом случае это должно вас закрыть
Использование коллекций
Item::where('type', '=', Item::TYPE_POST)
->with('source.name')
->get()
->mapWithKeys(function ($item) {
return [$item->service->name => $item];
})
->map(function ($items, $name) {
return [
$name => $items->count()
];
});
Используя запрос
DB::table('items')
->selectRaw('sources.name as name, count(*.items) as count')
->join('sources', 'sources.id', 'items.source_id')
->where('type', '=', Item::TYPE_POST)
->groupBy('sources.id')
->get()
->pluck('count', 'name')