use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\Rules\Enum;
class OrderController
{
public function update(Request $request, Order $order): JsonResponse
{
$validated = $request->validate([
'status' => ['required', new Enum(OrderStatus::class)],
]);
if ($order->status === OrderStatus::Completed) {
return response()->json([
'status_updated' => false,
'message' => 'Completed orders can’t be changed',
'order' => array_filter($order->toArray()),
], 400);
}
$order->update([
'status' => $validated['status'],
]);
return response()->json([
'status_updated' => true,
'products' => $order->products->map(fn ($product) => [
'id' => $product->id,
'name' => $product->name,
'updated_at' => $product->updated_at,
]),
]);
}
}
Route::patch('/test/orders/{order}', [OrderController::class, 'update']);
enum OrderStatus: int
{
case Pending = 1;
case Processing = 2;
case Completed = 3;
case Cancelled = 4;
}
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Order extends Model
{
/**
* @return array<string, string>
*/
protected function casts(): array
{
return [
'status' => OrderStatus::class,
];
}
/**
* @return HasMany<Product, $this>
*/
public function products(): HasMany
{
return $this->hasMany(Product::class);
}
}
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->tinyInteger('status');
$table->timestamps();
});
Note: PHP autodoc-laravel does not parse your migrations, it reads the columns directly from your DB.