如何在 Laravel 中创建一个 API 端点,可用于搜索我们想要的任何 table?

How to make an API endpoint in Laravel, that can be used to search any table we want?

背景

让我们考虑一个假设场景。假设我们的数据库中有五个不同的table,

  1. 客户
  2. 类别
  3. 产品
  4. 订单
  5. 订单详情

我们的客户希望我们在前端添加一个搜索栏,用户可以在其中搜索特定产品,点击搜索按钮后,匹配的产品必须显示在前端。

我解决这个问题的方法

为了添加上述功能,我遇到了以下策略。
我会添加一个输入框来输入产品名称和一个提交按钮。
按下提交按钮后,将向后端发送 GET 请求。查询参数中会包含用户输入的商品名称
一旦后端收到 GET 请求,我会将其传递给 ProductsController 并从 ProductController[=71] 中定义的方法中传递=],我会用Product模型去查询productstable看有没有匹配的结果[=72] =]
如果有任何匹配结果,我会将它们发送到 JSON 对象内的前端,如果没有任何匹配结果,我会在 JSON 对象内将成功标志设置为 false =] 对象并将其发送到前端
在前端,如果有匹配的结果,我会显示在屏幕上。否则,我将显示“未找到结果!”

我的方法有问题

如果我们只想搜索 产品 table,一切正常。但是,如果稍后我们的客户告诉我们类似 的内容怎么办?“还记得您为产品添加的搜索功能吗?我认为该功能也应该添加到订单中。我认为作为列表用户的订单越来越多,他们也应该能够搜索以前的订单。"

现在,由于我们之前的搜索产品方法是在 ProductController 中使用 Product 模型实现的,当我们向 Orders 添加相同的功能时,我们必须在 ProductsController 中再次执行与 相同的操作]OrdersController 使用 Order 模型。不用几秒钟就明白这会导致代码重复

问题总结

我们如何在 laravel 中添加一个 API 端点以获得可用于搜索我们数据库中任何 table 并获得结果的搜索功能,而不是将搜索功能限定为特定控制器和相应模型?

一个好的开始是创建一个名为 searchable 的特征,并将其添加到您要搜索的所有模型中,并将不同模型之间的任何共享逻辑放入其中。可能您希望手动允许不同的列,因此在每个模型中您都有一组可搜索的列,您可以在特征中引用这些列。

您的控制器必须指向相关模型并调用搜索特征中的方法。

正如其他人所指出的,这是一个高层次的问题,所以我不会讲得太详细。当然,有上百万种方法可以实现这一点,只需尝试保持共享逻辑就位即可。