Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][Laravel]Zsumowanie wartości z tablic
Forum PHP.pl > Forum > Przedszkole
Generic
Mam następującą kolekcję z tablicami tak jak w poniższym kodzie. Próbuję uzyskać sumę wartości price ze wszystkich zwróconych tablic. Próbowałem zrobić to na kilka sposobów jednak za każdym razem otrzymuję błąd. Czy ktoś mógłby podpowiedzieć mi jak mogę uzyskać zamierzony efekt?

  1.  
  2. array_column($order->toArray(), 'product')
  3.  
  4. // Rezultat
  5.  
  6. array:2 [▼
  7. 0 => array:12 [▼
  8. "id" => 1
  9. "name" => "Fitness tracker"
  10. "price" => 75.99
  11. "created_at" => "2018-11-30 13:15:18"
  12. "updated_at" => "2019-01-16 20:59:21"
  13. ]
  14. 1 => array:12 [▶]
  15. ]
  16.  
Pyton_000
Kod
var_dump($order->sum('price'));


Dokumentacja nie gryzie

https://laravel.com/docs/5.8/collections#method-sum
Generic
@Pyton_000

Niestety, użycie tej metody wyrzuca błąd - Call to a member function sum() on array.

  1.  
  2. var_dump(array_column($order->toArray(), 'product')->sum('price'))
  3.  
  4. // Rezultat
  5.  
  6. Call to a member function sum() on array.
  7.  
  8. var_dump(order->sum('price')
  9.  
  10. // Rezultat int(0)
  11.  


Pyton_000
Czym jest $order ?
Generic
$order stanowi wynik z zapytania - Order::with('product')->where('id', $id)->get();

  1. Collection {#638 ▼
  2. #items: array:2 [▼
  3. 0 => Order {#634 ▼
  4. #table: "orders"
  5. #fillable: array:6 [▶]
  6. #connection: "mysql"
  7. #primaryKey: "id"
  8. #keyType: "int"
  9. +incrementing: true
  10. #with: []
  11. #withCount: []
  12. #perPage: 15
  13. +exists: true
  14. +wasRecentlyCreated: false
  15. #attributes: array:9 [▶]
  16. #original: array:9 [▶]
  17. #changes: []
  18. #casts: []
  19. #dates: []
  20. #dateFormat: null
  21. #appends: []
  22. #dispatchesEvents: []
  23. #observables: []
  24. #relations: array:1 [▼
  25. "product" => Product {#673 ▼
  26. #connection: "mysql"
  27. #table: "products"
  28. #primaryKey: "id"
  29. #keyType: "int"
  30. +incrementing: true
  31. #with: []
  32. #withCount: []
  33. #perPage: 15
  34. +exists: true
  35. +wasRecentlyCreated: false
  36. #attributes: array:12 [▼
  37. "id" => 1
  38. "Name" => "Fitness tracker"
  39. "price" => 75.99
  40. "created_at" => "2018-11-30 13:15:18"
  41. "updated_at" => "2019-01-16 20:59:21"
  42. ]
  43. #original: array:12 [▶]
  44. #changes: []
  45. #casts: []
  46. #dates: []
  47. #dateFormat: null
  48. #appends: []
  49. #dispatchesEvents: []
  50. #observables: []
  51. #relations: []
  52. #touches: []
  53. +timestamps: true
  54. #hidden: []
  55. #visible: []
  56. #fillable: []
  57. #guarded: array:1 [▶]
  58. }
  59. ]
  60. #touches: []
  61. +timestamps: true
  62. #hidden: []
  63. #visible: []
  64. #guarded: array:1 [▶]
  65. }
  66. 1 => Order {#635 ▶}
  67. ]
  68. }


Jak widać jest to złożona struktura, dlatego spróbowałem ją uprościć stosując array column.
Pyton_000
$order->product->sum('price');
Generic
Niestety zwraca błąd Property [product] does not exist on this collection instance. Wydaję mi się, że nie można w tym przypadku bezpośrednio odwołać się do product.
Pyton_000
zamień product na nazwę metody która odwołuje się do relacji oneToMany w modelu Order (ale bez nawiasów)
markonix
  1. Order::with('product')->where('id', $id)->get()->sum('product.price');


Abo utworzyć w modelu Order metodę getSummary() i w niej.
  1. $this->products->sum('price');


Ale wcześniej struktura do poprawy. Co to jest product? Zamówienie może mieć tylko tylko jeden, że w liczbie pojedynczej?
I jak to się ma do produktów w systemie? To powinna być tabela typu pivot łącząca katalog produktów, z produktem w zamówieniu.
Generic
@markonix, Order to kolumna, która zawiera klucz obcy id produktu z tabeli produkty. Do niej utworzyłem następującą relację:

  1. public function product() {
  2. return $this->belongsTo('App\Product', 'product_id', 'id');
  3. }


markonix
Chyba model?
Bez sensu nazwa, bo Order to Zamówienie więc główny obiekt, a do niego powinno być coś w stylu HasMany - OrderItem lub OrderProduct.
Generic
Struktura mojej bazy wygląda następująco:

Cart table (przechowuje informacje o zamówieniu):

id
user_id
shipping_id

Order table (przechowuje zamówione przedmioty):

id
user_id
product_id
quantity


User table (przechowuje dane klienta);

id
name
surname
etc.

Dla tabeli Cart utworzyłem relację Belongs to user z kluczem obcym user_id. Tabela Order zawiera relację Belongs to products z kluczem product_id. Struktura działa gdyż jestem w stanie pętlą foreach zwrócić zamówione przedmioty i dane klienta. Mam jednak problem ze zwróceniem wartości całego zamówienia.

Okey, dodałem zmienną:

  1. $total = Order::with('product')->where('id', $id)->get()->sum('product.price');



Działa tak jak tego oczekiwałem, jednak myślałem o tym by te informacje pochodziły z pierwotnego zapytania (tak jak poniżej), aby nie tworzyć nowego skoro są zawarte w jednym.

  1. Order::with('product')->where('id', $id)->get();
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.