2017-08-19 2 views
0

J'ai un modèle appelé Order comme ceci:Laravel: Regroupement des lignes

class Order extends Model 
{ 
    public function offer() 
    { 
    return $this->belongsTo(Offer::class); 
    } 
} 

lignes Exemple peut ressembler à ceci

id quantity offer_id 
15 5   20 
20 1   21 
25 3   20 
30 2   27 
35 1   20 
40 1   21 

Je veux regrouper toutes les commandes par offer_id en utilisant Laravel Eloquent pour donner la sortie suivante:

[ 
    [20] => [ 
     // order 15, 
     // order 25, 
     // order 35, 
    ], 
    [21] => [ 
     // order 20, 
     // order 40, 
    ] 
    [27] => [ 
     // order 30, 
    ] 
] 

Comment puis-je le faire efficacement? Je l'ai essayé ce qui suit:

Order::groupBy('offer_id)->get(); 

Mais ce cache tout ordre avec le même offer_id.

Notez que je vais idéalement faire tout cela dans Laravel Elqouent, donc pas de faire du post-traitement.

+0

Que diriez-vous 'votre commande :: get() -> groupBy ('OFFER_ID')', ce édite la collection après qu'il a été tiré par les cheveux, mais fait ce que vous voulez (comme [ici documenté ] (https://laravel.com/docs/5.4/collections#available-methods) – milo526

Répondre

1

La méthode de collecte laravel groupBy fait exactement cela.

Les groupes méthode GroupBy les items de la collection par une clé donnée:

$orders = Order::get()->groupBy('offer_id'); 

Cela fonctionne depuis le générateur de requêtes retourne une collection, vous pouvez enchaîner les aides de collecte Sur ce objet pour obtenir désiré résultat.

Documentation disponible sur le Laravel site

0

Ne pouvez-vous pas le faire en obtenant toutes les offres qui ont des ordres? c'est-à-dire Offer->with('order')->orderBy('offer_id')->get()