Pracuję w Lavel i muszę filtrować użytkowników, którzy zamówieni z pewną ilością pieniędzy w zamówieniach, więc używałem liczby zleceń

 User::where('type','client')
            ->has('orders', '>=', $min_orders)
            ->has('orders', '<=', $max_orders)
            ->withCount('orders')
        ->paginate(25)
        ;
3
user10076385 28 luty 2019, 20:23

2 odpowiedzi

Najlepsza odpowiedź

Jeśli chcesz sumować informacje o Informacje o użytkowniku, musisz skontaktować się z info użytkownika. A jeśli chcesz sumować na liście stoliku, musisz dołączyć do tej tabeli. Zakładając, że masz pole orders.amount, możesz spróbować tego:

<?php

User::select('user.id', 'email', 'name', 'type', \DB::raw('SUM(orders.amount) as amount_sum'))
    ->where('type','client')
    ->join('orders', 'orders.user_id', '=', 'user.id')
    ->has('orders', '>=', $min_orders)
    ->has('orders', '<=', $max_orders)
    ->withCount('orders')
    ->groupBy('user.id', 'email', 'name', 'type')
    ->havingRaw('amount_sum > ?', [50])
    ->orderBy('amount_sum', 'desc')
    ->paginate(25);

W ten sposób można paginować bezpośrednio do jednego wyników zapytań. Ale pamiętaj, że każda kolumna użytkownika, której chcesz użyć w wybranej, musi być używany w grupie.

0
KeitelDOG 1 marzec 2019, 03:07

Spróbuj tego

$users = User::filter(function ($user) use ($min_orders, $max_orders) {
    return ($user->orders()->sum('price') >= $min_orders) && ($user->orders()->sum('price') <= $max_orders);
})->get();

Nie testował, ale myślę, że to powinno działać

2
Nevermind23 28 luty 2019, 18:07