Laravel如何不通过id而是通过title字段查询获取对应数据
完全可以实现,以下是具体操作步骤,同时会先修正你现有代码的两处小问题:
现有代码问题修正
你当前路由绑定的方法名是getBookById,但控制器内实际定义的方法名为getBookByAuthor,且方法内重复执行了查询逻辑,修正后的按ID查询方法参考:
// app/Http/Controllers/BooksController.php public function getBookById($id) { $book = Books::find($id); if (is_null($book)){ return response()->json(['message' => 'Book Not Found.'], 404); } return response()->json($book, 200); }
按标题查询实现步骤
1. 新增API路由
推荐两种实现方案,可根据业务场景选择:
方案A:路径参数模式(适合精确匹配标题场景)
在routes/api.php中添加路由:Route::get('books/title/{title}', 'App\Http\Controllers\BooksController@getBookByTitle');方案B:查询参数模式(适合搜索框模糊搜索场景,更推荐)
图书标题通常包含空格、特殊符号,放在查询参数中框架会自动处理编码,更适配搜索场景,在routes/api.php中添加路由:Route::get('books/search', 'App\Http\Controllers\BooksController@searchBooksByTitle');
2. 编写控制器对应方法
对应方案A的精确匹配方法:
// app/Http/Controllers/BooksController.php public function getBookByTitle($title) { $books = Books::where('title', $title)->get(); if ($books->isEmpty()) { return response()->json(['message' => 'No matching books found'], 404); } return response()->json($books, 200); }对应方案B的模糊搜索方法:
// app/Http/Controllers/BooksController.php // 顶部先引入Request类 use Illuminate\Http\Request; public function searchBooksByTitle(Request $request) { // 校验请求参数必填 $validated = $request->validate([ 'title' => 'required|string|min:1' ]); // 模糊匹配包含关键词的所有图书,Eloquent会自动处理参数绑定,无SQL注入风险 $books = Books::where('title', 'like', "%{$validated['title']}%")->get(); return response()->json($books, 200); }
3. Angular前端调用示例(对应方案B)
在Angular的请求服务中添加搜索方法即可:
// book.service.ts import { HttpClient, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class BookService { constructor(private http: HttpClient) {} searchBooksByTitle(title: string) { const params = new HttpParams().set('title', title); return this.http.get('/api/books/search', { params }); } }
内容的提问来源于stack exchange,提问作者Random Dev
相关产品推荐
相关产品推荐

