Группируйте и рассчитывайте на связанную модель

#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')