Maison  >  Questions et réponses  >  le corps du texte

Comment calculer la somme de deux colonnes et le nombre de relations associées dans Laravel ?

J'ai deux tables : les acheteurs et les commandes. Les acheteurs ont de nombreuses commandes.

Je veux la somme de tous les acheteurs et le nombre de commandes et deux colonnes de commandes (prix, frais) sur une période de temps spécifique. Je peux obtenir le décompte en procédant comme suit :

Buyer::withCount([
    'orders' => fn ($query) => $query
        ->where('created_at', '>=', $dateTo)
])
->get();

Mais comment obtenir la somme (->where('created_at', '>=', $dateTo)) d'une période de temps spécifiée ?

P粉788571316P粉788571316215 Il y a quelques jours437

répondre à tous(2)je répondrai

  • P粉567112391
  • P粉189606269

    P粉1896062692024-02-22 00:03:31

    Pour utiliser une variable à l'intérieur d'une fermeture, vous devez envoyer sa valeur à la fonction en utilisant use() .

    Pour utiliser withSum({relation},{column}), vous devez passer des appels séparés pour chacun.

    Buyer::withCount([
            'orders' => function ($query) use ($dateTo) { 
                $query->where('created_at', '>=', $dateTo);
            }
        ])
        ->withSum([
            'orders' => function ($query) use ($dateTo) { 
                $query->where('created_at', '>=', $dateTo);
            }
        ], 'price')
        ->withSum([
            'orders' => function ($query) use ($dateTo) { 
                $query->where('created_at', '>=', $dateTo);
            }
        ], 'charge')
        ->get();

    withSum() Uniquement disponible dans Laravel version 8 ou supérieure.

    EditSyntaxe de la fonction flèche

    Buyer::withCount([
            'orders' => fn ($query) $query->where('created_at', '>=', $dateTo),
        ])
        ->withSum(['orders' => fn ($query) $query->where('created_at', '>=', $dateTo)], 'price')
        ->withSum(['orders' => fn ($query) $query->where('created_at', '>=', $dateTo)], 'charge')
        ->get();

    répondre
    0
  • Annulerrépondre