Преобразование необработанного запроса в красноречивый laravel - PullRequest
1 голос
/ 24 февраля 2020

Отношения:

public function category()
    {
        return $this->belongsTo(Category::class, 'category_id');
    }

public function status() 
    {
        return $this->belongsTo(Status::class, 'status_id');
    }

Запрос:

return DB::table('asset_management_system.assets')
        ->join('asset_management_system.categories', 'asset_management_system.assets.category_id', '=', 'asset_management_system.categories.id')
        ->select('asset_management_system.categories.name', 'asset_management_system.categories.icon')
        ->selectRaw('count(asset_management_system.assets.category_id) as count,
        sum(case when status_id = 1 then 1 else 0 end) AS assigned,
        sum(case when status_id = 2 then 1 else 0 end) AS "stored",
        sum(case when status_id = 3 then 1 else 0 end) AS missing,
        sum(case when status_id = 4 then 1 else 0 end) AS broken')
        ->groupBy('asset_management_system.assets.category_id')
        ->get();

Этот запрос в настоящее время возвращает счет ассигнованных, хранимых, отсутствующих и поврежденных активов для каждой категории. Как я могу преобразовать это в красноречивое?

1 Ответ

1 голос
/ 25 февраля 2020

Ваш запрос полностью в порядке. Я считаю, что это наиболее эффективный подход.

В качестве альтернативы, вы можете использовать функцию withCount .

Я полагаю, вы уже получили свою модель категории:

class Category extends Model
{
    public function assets()
    {
        return $this->hasMany(Asset::class);
    }
}
$categories = Category::withCount([
    'assets',
    'assets as assigned_count' => function ($query) {
        $query->where('status_id', 1);
    },
    'assets as stored_count' => function ($query) {
        $query->where('status_id', 2);
    },
    'assets as missing_count' => function ($query) {
        $query->where('status_id', 3);
    },
    'assets as broken_count' => function ($query) {
        $query->where('status_id', 4);
    },
])
->get();

Тогда:

$categories->each(function ($category) {
    dump($category->assets_count);
    dump($category->assigned_count);
    dump($category->stored_count);
    dump($category->missing_count);
    dump($category->broken_count);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...