sql >> Databáze >  >> RDS >> Mysql

Při použití whereHas v Laravelu vyberte SUM z poddotazu

Můžete použít withCount() získat součet ze souvisejícího modelu jako

$result = Customer::select([
            'customers.id',
            'customers.last_name'
        ])->withCount([
            'customerInvoices as invoice_sum' => function($query) {
                $query->select(DB::raw('SUM(total_price)'));
            }
        ])->whereHas('customerInvoices', function(Builder $q) {
            $q->where('customer_invoices.status', 1);
        })->get();

Dalším způsobem, jak získat součet, můžete definovat hasOne() vztah ve vašem modelu zákazníka jako

public function invoice_sum()
{
    return $this->hasOne(CustomerInvoice::class)
        ->select('customer_id',
            DB::raw('sum(total_price)')
        )->groupBy('customer_id');
}

A v nástroji pro tvorbu dotazů

$result = Customer::select([
            'customers.id',
            'customers.last_name',
        ])->with('invoice_sum')
          ->whereHas('customerInvoices', function(Builder $q) {
            $q->where('customer_invoices.status', 1);
        })->get();      

Podle Eloquent :withCount() přepíše $columns na get() problém nejprve vložte select() mehtod a poté použijte with() funkce




  1. Úprava pro výchozí nastavení časového pásma na RDS

  2. Vytvoření CTE v Oracle

  3. Počítat instance v tabulce1 A odkaz na tabulku2

  4. Pořadí vrácení řádku SQL