@Foued I was able to work with your solution to produce something like this.

However, I needed to highlight a few things someone may have to do if they would have more than one row to 'rowspan' on different columns.
- You don't need an else after the
@if($loop->first)
- You'll have to use the
@if($loop->first) for every row you will 'rowspan' under a different column. E.g Invoice Column, Country, Order Date etc.
From the screenshot, you can see that Invoice, Country, Deliver To, Supplier, Order Date,Store Branch, Paid and Payment Date columns have a merged row where else Item, Qty and Expiry Date columns have split rows.
Below is the code that produced that.
<table class="table table-bordered">
<thead>
<tr>
<th>Invoice</th>
<th>Country</th>
<th>Deliver To</th>
<th>Supplier</th>
<th>Catalogue</th>
<th>Item</th>
<th>Qty</th>
<th>Expiry Date</th>
<th>Order Date</th>
<th>Store Branch</th>
<th>Paid</th>
<th>Payment Date</th>
</tr>
</thead>
<tbody>
@foreach ($data as $item)
@foreach ($item as $row)
<tr>
@if($loop->first)
<td rowspan="{{ count($item) }}">{{$row['invoice_number']}}</td>
<td rowspan="{{ count($item) }}">{{$row['country']}}</td>
<td rowspan="{{ count($item) }}">{{$row['deliver_to']}}</td>
<td rowspan="{{ count($item) }}">{{$row['supplier']}}</td>
@endif
<td>{{$row['catalogue_number']}}</td>
<td>{{$row['commodity']}}</td>
<td>{{$row['quantity']}}</td>
<td>{{$row['expiry_date']}}</td>
@if($loop->first)
<td rowspan="{{ count($item) }}">{{$row['order_date']}}</td>
<td rowspan="{{ count($item) }}">{{$row['branch_name']}}</td>
<td rowspan="{{ count($item) }}">{{$row['payment_status']}}</td>
<td rowspan="{{ count($item) }}">{{$row['payment_date']}}</td>
@endif
</tr>
@endforeach
@endforeach
</tbody>
</table>
I implemented the controller the same way @FouedMoussi did.