Reputation: 434
its a simple query in a controller using Order model:
$orders = Order::where('user_id', auth()->user()->id)
->orderBy('created_at', 'desc')
->get();
return dd($orders);
dd gives following results: (which is correct)
Collection {#269 ▼
#items: array:2 [▼
0 => Order {#270 ▼
#dates: array:1 [▶]
#fillable: array:6 [▶]
#connection: "mysql"
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:9 [▶]
#original: array:9 [▶]
#changes: []
#casts: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#guarded: array:1 [▶]
#forceDeleting: false
}
1 => Order {#271 ▼
#dates: array:1 [▶]
#fillable: array:6 [▶]
#connection: "mysql"
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:9 [▶]
#original: array:9 [▶]
#changes: []
#casts: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#guarded: array:1 [▶]
#forceDeleting: false
}
]
}
but when i iterate through the $orders collection foreach loop, only the first array is is shown, the second array is not accessible... whats wrong with foreach loop... ?
$temp='';
foreach($orders as $order){
$temp.= $order->product; // accessing the belongTo method
}
dd($temp);
here is the output (only one array is shown):
"{"id":13,"created_at":"2018-06-06 15:28:21","updated_at":"2018-06-06 18:36:28","type":0,"title":"product 3","description":"this is product no 3 with 5 images","images":"night-product-watch-dramatic-84475_1528310188.jpeg,night-product-watch-dramatic-84475_1528310188.jpeg","alive":1,"user_id":1,"deleted_at":null} ◀"
Upvotes: 1
Views: 10417
Reputation: 1732
Try this:
$temp= [];
foreach($orders->all() as $order){
$temp[] = $order->product;
}
And you may edit your query
$orders = Order::where('user_id', auth()->user()->id)
->with('products')
->orderBy('created_at', 'desc')
->get();
Upvotes: 0
Reputation: 5105
If you are building an array of products across all orders you cannot use string concatenation. Use an array and push items onto it.
$products = [];
foreach ($orders as $order) {
if ($order->product) {
$products[] = $order->product;
}
}
dd($products); // will be an array of all other products.
Upvotes: 1