Step 01: Changing index() method in OrderController
public function index( Request $request ) { $meta_title = 'All Orders'; $query = Order::query(); $orders = $query->with('order_items')->orderBy( 'id', 'desc' )->paginate( 10 )->withQueryString(); //dd($orders); return view( 'orders.list', compact( 'meta_title','orders' ) ); }
Above, in query we have dynamically loaded order item as has many relationship to avoid loading it multiple times in list blade views for fetching number of items for each individual order.
Step 02: Changing Order.php model adding has many relationship with order items
namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Order extends Model { use HasFactory; public function order_items() { return $this->hasMany( OrderItem::class ); } }
Step 03: Changing list.blade.php under views/resources/orders folder for fetching and showing database rows using loop and adding a confirm delete modal for deleting a row of data
<div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="row"> <div class="col-md-4"> <h2 class="">All Orders</h2> </div> </div> <table class="table mt-3"> <thead class="table-dark"> <tr> <th>Id</th> <th class="text-center">Number Of Items </th>
<th class="text-center">Costs </th> <th class="text-center">Company </th> <th class="text-center">Phone No </th> <th class="text-center">Emails </th> <th class="text-center">Job / Post No </th> <th class="text-center">Email Sent? </th> <th class="text-center">Created</th> <th class="text-center">Actions</th> </tr> </thead> <tbody> @foreach ($orders as $order) <tr> <td>{{$order->id}}</td> <td class="text-center">{{ $order->order_items->count() }}</td>
<td class="text-center">{{ $order->order_items->sum('cost') }}</td> <td class="text-center">{{ $order->company_name }}</td> <td class="text-center">{{ $order->phone_number }}</td> <td class="text-center">{{ $order->email }}</td> <td class="text-center">{{ $order->job_number }}</td> <td class="text-center">{!! $order->status == 1 ? 'Sent':'Not Sent' !!}</td> <td class="text-center">{{ date('y-m-d', strtotime($order->created_at)) }}</td> <td class="text-center"> <a class="text-black" href="" title="Download Order Invoice"><i class="bi bi-download"></i></a> <a class="text-black" href="" title="Preview Order"><i class="bi bi-eye"></i></a> <a class="text-black" href="{{ route('orders.edit', $order->id) }}"><i class="bi bi-pencil"></i></a> <a class="text-black delete-row" href="javascript:void(0);" data-base-url="{{ url('') }}" data-rowname="{{ $order->id }}" data-rowid="{{ $order->id }}" data-resource="orders"><i class="bi bi-trash"></i></a></td> </td> </tr> @endforeach @if (count($orders) == 0) <tr><td colspan="10"><span class="">Nothing found</span></td></tr> @endif </tbody> </table> <div class="justify-content-center mt-3"> {!! $orders->links() !!} </div> </div> </div> </div> <div id="modal-delete-confirm" class="modal fade"> <div class="modal-dialog modal-md modal-dialog-centered" > <div class="modal-content" > <div class="modal-header"> <h4><strong >Confirm Delete </strong></h4> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-hidden="true"></button> </div> <div class="modal-body text-center"> <p>Would you like to delete this row <span id="modal-delete-title"></span>? <br>Once deleted it cannot be reverted.</p> <div class="row justify-content-center"> <div class="col-3"> <form id="list-frm-modal" class="float-start" method="POST" action=""> @csrf @method('DELETE') <button type="submit" class="btn btn-sm btn-danger white">Yes</button> </form> <a href="javascript:void(0);" class="btn btn-sm btn-info white float-end" data-bs-dismiss="modal">No</a> </div> </div> </div> </div> </div> </div>
Above, we have used count() method on order->order_items relationship which is now a collection method instead of eloquent query. So, It has been used to avoid querying database each time a loop is used for showing individual order.
Also, we have used sum() collection method on 'cost' column of order item for summing total cost of an order.