Nano Hash - криптовалюты, майнинг, программирование

Группировка Laravel по столбцу отношений

У меня есть модель Invoice_Detail, которая обрабатывает все продукты и их количество, эта модельная таблица invoice_details имеет столбцы item_id и qty.

Invoice_Detail имеет отношение к модели Items, которая содержит все данные элемента в своей таблице items, в которой есть item_id, name, category_id.

Модель Item также связана с моделью Category, которая содержит данные всех категорий в своей таблице categories.

Вопрос: Я хочу выбрать пять лучших категорий из Invoice_Detail, как?

Вот что я сделал:

$topCategories = InvoiceDetail::selectRaw('SUM(qty) as qty')
    ->with(['item.category' => function($query){
        $query->groupBy('id');
    }])
    ->orderBy('qty', 'DESC')
    ->take(5)->get();

Но не получилось!!

[{"qty":"11043","item":null}]

  • определить: не работает 01.02.2018
  • @Jerodev, проверьте правку. 01.02.2018
  • Итак, какой именно результат вы хотите? Вы хотите, чтобы 5 лучших категорий для одного счета-фактуры? 01.02.2018
  • @Jerodev, вообще 5 лучших категорий. для всех счетов. 01.02.2018

Ответы:


1
Category::select('categories.*',\DB::raw('sum("invoice_details"."qty") as "qty"'))
        ->leftJoin('items', 'items.category_id', '=', 'categories.id')
        ->leftJoin('invoice_details', 'invoice_details.item_id', '=', 'items.id')
        ->groupBy('categories.id')
        ->orderBy('qty','DESC')
        ->limit(5)
        ->get();

Это вернет вам коллекцию лучших категорий. Протестировано на laravel 5.5 и PostgreSQL.

UPD: Чтобы решить эту проблему без соединений, вы можете добавить в модель категорий следующее:

public function invoiceDetails()
{
    return $this->hasManyThrough(Invoice_Detail::class, Item::class);
}

И чтобы выбрать 5 лучших категорий:

$top = Category::select()->with('invoiceDetails')
    ->get()->sortByDesc(function($item){
        $item->invoiceDetails->sum('qty');
    })->top(5);

Но первое решение с объединениями будет работать быстрее.

01.02.2018
  • Да, это сработает, но мне нужно без соединения, с помощью with или красноречивой коллекции. 04.02.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..