这是我的类别表迁移文件中包含的代码:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->foreignId('parent_id')->nullable()->constrained('categories')->onDelete('cascade');
$table->string('name');
$table->string('icon')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('categories');
}
};
这是我的 Category.php 模型文件中包含的代码:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
use HasFactory;
protected $fillable = ['parent_id', 'name', 'icon'];
public function scopeParentCategories($query)
{
return $query->whereNull('parent_id');
}
public static function tree()
{
$allCategories = Category::get();
$rootCategories = $allCategories->whereNull('parent_id');
self::buildTree($rootCategories, $allCategories);
return $rootCategories;
}
public function children()
{
return $this->hasMany(Category::class, 'parent_id');
}
public function items()
{
return $this->belongsToMany(Item::class, 'category_items');
}
public function saveSubCategories($subCategories)
{
foreach($subCategories as $subCategory) {
$this->saveSubCategory($subCategory);
}
}
public function saveSubCategory($subCategory)
{
$newSubCategory = new self();
$newSubCategory->fill($subCategory);
$newSubCategory->setAttribute('parent_id', $this->id);
$newSubCategory->save();
}
private static function formatTree($categories, $allCategories)
{
foreach ($categories as $category) {
$category->children = $allCategories->where('parent_id', $category->id)->values();
if ($category->children->isNotEmpty()) {
self::formatTree($category->children, $allCategories);
}
}
}
}
这是我的 CategoryController.php 控制器文件中包含的代码:
<?php
namespace App\Http\Controllers;
use App\Models\Category;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class CategoryController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
return Category::all();
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'icon' => 'nullable|string|max:255',
'children.*.name' => 'required|string|max:255',
'children.*.icon' => 'required|string|max:255',
'children.*.parent_id' => 'nullable|exists:categories,id',
]);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 400);
}
$category = Category::create($request->only('name', 'icon'));
if ($request->has('children')) {
foreach ($request->children as $childData) {
$child = new Category($childData);
$child->parent_id = $category->id;
$child->save();
}
}
return $category;
}
/**
* Display the specified resource.
*/
public function show(Category $category)
{
return Category::find($category);
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Category $category)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Category $category)
{
$category = Category::findOrFail($category);
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'parent_id' => 'nullable|exists:categories,id',
'icon' => 'nullable|string|max:255',
]);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 400);
}
$category->update($request->all());
return response()->json($category);
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Category $category)
{
$category = Category::findOrFail($category);
$category->delete();
return response()->json($category);
}
}
这是我的 api.php 路由文件中包含的代码:
<?php
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\CategoryController;
use App\Http\Controllers\ItemController;
use App\Http\Controllers\ItemOptionController;
use App\Http\Controllers\OptionController;
use App\Http\Controllers\OptionValueController;
use App\Http\Controllers\OrderController;
use App\Http\Controllers\OrderItemController;
use App\Http\Controllers\PaymentController;
use App\Http\Controllers\QRCodeController;
use App\Http\Controllers\TableLayoutController;
// API version prefix
Route::prefix('v1')->group(function () {
// Routes for managing categories
Route::get('categories', [CategoryController::class, 'index']);
Route::post('categories', [CategoryController::class, 'store']);
Route::get('categories/{category}', [CategoryController::class, 'show']);
Route::put('categories/{category}', [CategoryController::class, 'update']);
Route::delete('categories/{category}', [CategoryController::class, 'destroy']);
// Routes for managing items
Route::get('items', [ItemController::class, 'index']);
Route::post('items', [ItemController::class, 'store']);
Route::get('items/{item}', [ItemController::class, 'show']);
Route::put('items/{item}', [ItemController::class, 'update']);
Route::delete('items/{item}', [ItemController::class, 'destroy']);
// Routes for managing orders
Route::get('orders', [OrderController::class, 'index']);
Route::post('orders', [OrderController::class, 'store']);
Route::get('orders/{order}', [OrderController::class, 'show']);
Route::put('orders/{order}', [OrderController::class, 'update']);
Route::delete('orders/{order}', [OrderController::class, 'destroy']);
// Routes for managing payments
Route::get('payments', [PaymentController::class, 'index']);
Route::post('payments', [PaymentController::class, 'store']);
Route::get('payments/{payment}', [PaymentController::class, 'show']);
Route::put('payments/{payment}', [PaymentController::class, 'update']);
Route::delete('payments/{payment}', [PaymentController::class, 'destroy']);
// Routes for managing options
Route::get('options', [OptionController::class, 'index']);
Route::post('options', [OptionController::class, 'store']);
Route::get('options/{option}', [OptionController::class, 'show']);
Route::put('options/{option}', [OptionController::class, 'update']);
Route::delete('options/{option}', [OptionController::class, 'destroy']);
// Routes for managing option values
Route::get('option-values', [OptionValueController::class, 'index']);
Route::post('option-values', [OptionValueController::class, 'store']);
Route::get('option-values/{optionvalues}', [OptionValueController::class, 'show']);
Route::put('option-values/{optionvalues}', [OptionValueController::class, 'update']);
Route::delete('option-values/{optionvalues}', [OptionValueController::class, 'destroy']);
// Routes for managing item options
Route::get('item-options', [ItemOptionController::class, 'index']);
Route::post('item-options', [ItemOptionController::class, 'store']);
Route::get('item-options/{itemoptions}', [ItemOptionController::class, 'show']);
Route::put('item-options/{itemoptions}', [ItemOptionController::class, 'update']);
Route::delete('item-options/{itemoptions}', [ItemOptionController::class, 'destroy']);
// Routes for managing order items
Route::get('order-items', [OrderItemController::class, 'index']);
Route::post('order-items', [OrderItemController::class, 'store']);
Route::get('order-items/{orderItem}', [OrderItemController::class, 'show']);
Route::put('order-items/{orderItem}', [OrderItemController::class, 'update']);
Route::delete('order-items/{orderItem}', [OrderItemController::class, 'destroy']);
// Routes for managing QR codes
Route::get('qr-codes', [QRCodeController::class, 'index']);
Route::post('qr-codes', [QRCodeController::class, 'store']);
Route::get('qr-codes/{qrCode}', [QRCodeController::class, 'show']);
Route::put('qr-codes/{qrCode}', [QRCodeController::class, 'update']);
Route::delete('qr-codes/{qrCode}', [QRCodeController::class, 'destroy']);
// Routes for managing table layouts
Route::get('table-layouts', [TableLayoutController::class, 'index']);
Route::post('table-layouts', [TableLayoutController::class, 'store']);
Route::get('table-layouts/{tableLayout}', [TableLayoutController::class, 'show']);
Route::put('table-layouts/{tableLayout}', [TableLayoutController::class, 'update']);
Route::delete('table-layouts/{tableLayout}', [TableLayoutController::class, 'destroy']);
});
我正在使用 Postman 来测试我的 Laravel 应用程序后端。我正在 docker 上运行我的数据库。所有路线均无效,但我在此处显示类别作为参考。我尝试运行 post 方法但失败了
愚蠢的错误:
必须在 bootstrap->cache->app.php 中提及基本路径
<?php
use Illuminate\Foundation\Application; use Illuminate\Foundation\Configuration\Exceptions; use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
//
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();