// -m 生成迁移文件
php artisan make:model Post -m
php artisan make:controller PostController --resource
php artisan make:resource PostResource
控制器
<?php
use App\Http\Resources\PostResource;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class PostController extends Controller
{
// 列表 (Index)
public function index(Request $request)
{
$query = Post::query();
// 搜索条件
if ($request->has('search')) {
$search = $request->input('search');
$query->where('title', 'like', "%{$search}%")
->orWhereHas('user', function ($q) use ($search) {
$q->where('name', 'like', "%{$search}%");
})
->orWhereHas('email', function ($q) use ($email) {
$q->where('email', $email);
});
}
// 排序
$sortBy = $request->input('sort_by', 'created_at');
$sortOrder = $request->input('sort_order', 'desc');
$query->orderBy($sortBy, $sortOrder);
// 分页
$perPage = $request->input('per_page', 10);
$posts = $query->with(['user', 'category'])->paginate($perPage);
return PostResource::collection($posts);
}
// 创建 (Create)
public function store(Request $request)
{
try {
$validated = $request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string',
'user_id' => 'required|exists:users,id',
'category_id' => 'required|exists:categories,id',
]);
$post = Post::create($validated);
return new PostResource($post);
} catch (ValidationException $e) {
return response()->json(['error' => $e->errors()], 422);
} catch (\Exception $e) {
return response()->json(['error' => 'An error occurred while creating the post.'], 500);
}
}
// 读取 (Read)
public function show($id)
{
try {
$post = Post::findOrFail($id);
return new PostResource($post);
} catch (ModelNotFoundException $e) {
return response()->json(['error' => 'Post not found'], 404);
} catch (\Exception $e) {
return response()->json(['error' => 'An error occurred while retrieving the post.'], 500);
}
}
// 更新 (Update)
public function update(Request $request, $id)
{
try {
$validated = $request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string',
'user_id' => 'required|exists:users,id',
'category_id' => 'required|exists:categories,id',
]);
$post = Post::findOrFail($id);
$post->update($validated);
return new PostResource($post);
} catch (ValidationException $e) {
return response()->json(['error' => $e->errors()], 422);
} catch (ModelNotFoundException $e) {
return response()->json(['error' => 'Post not found'], 404);
} catch (\Exception $e) {
return response()->json(['error' => 'An error occurred while updating the post.'], 500);
}
}
// 删除 (Delete)
public function destroy($id)
{
try {
$post = Post::findOrFail($id);
$post->delete();
return response()->json(null, 204);
} catch (ModelNotFoundException $e) {
return response()->json(['error' => 'Post not found'], 404);
} catch (\Exception $e) {
return response()->json(['error' => 'An error occurred while deleting the post.'], 500);
}
}
}
模型
<?php
// app/Models/Post.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Post extends Model
{
use HasFactory;
protected $fillable = ['user_id', 'category_id', 'title', 'content'];
public function user()
{
return $this->belongsTo(User::class);
}
public function category()
{
return $this->belongsTo(Category::class);
}
}
<?php
// app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class User extends Model
{
use HasFactory;
protected $fillable = ['name', 'email', 'password'];
public function posts()
{
return $this->hasMany(Post::class);
}
}
<?php
// app/Models/Category.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Category extends Model
{
use HasFactory;
protected $fillable = ['name'];
public function posts()
{
return $this->hasMany(Post::class);
}
}
资源
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
// 自动返回模型的所有字段
$data = parent::toArray($request);
// 添加自定义字段
$data['user'] = new UserResource($this->whenLoaded('user'));
$data['category'] = new CategoryResource($this->whenLoaded('category'));
return $data;
//return [
// 'id' => $this->id,
// 'title' => $this->title,
// 'content' => $this->content,
//];
}
路由
use App\Http\Controllers\PostController;
Route::apiResource('posts', PostController::class);