You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:57:04