Вообще-то единственное число от dishes - dish, а не dishe.
Достаточно создавать их с полем order_id = $order->id, чтобы при выборке они зацепились.
задача построить отчет по отказам.
На счёт частичной оплаты не понятно — зачем вообще такое, почему недостаточно оплачивать всё и сразу.
Если будут десятки-сотни-тысячи одинаковых позиций
Route::controller(\App\Http\Controllers\OrderController::class)->prefix('/orders')->group(function() {
Route::prefix('/{order}')->group(function() {
Route::patch('/', 'update')->can('view', 'project');
Route::put('/', 'update')->can('view', 'project');
});
});
$this->order->canChangeStatus($this->get('status'))эта проверка не совсем корректна в authorize, так как нам нельзя редактировать именно статус заказа, остальное можно (п. 1 из тела вопроса).
Но quantity в БД нет, т. к. оно всегда равно 1, потому что каждая позиция, даже если она совпадает с предыдущей - это отдельная запись (логика разделения нужна для отказа, статистики и частичной оплаты позиций в заказе)