如何在 Laravel 中创建一个 API 端点,可用于搜索我们想要的任何 table?
How to make an API endpoint in Laravel, that can be used to search any table we want?
背景
让我们考虑一个假设场景。假设我们的数据库中有五个不同的table,
- 客户
- 类别
- 产品
- 订单
- 订单详情
我们的客户希望我们在前端添加一个搜索栏,用户可以在其中搜索特定产品,点击搜索按钮后,匹配的产品必须显示在前端。
我解决这个问题的方法
为了添加上述功能,我遇到了以下策略。
我会添加一个输入框来输入产品名称和一个提交按钮。
按下提交按钮后,将向后端发送 GET 请求。查询参数中会包含用户输入的商品名称
一旦后端收到 GET 请求,我会将其传递给 ProductsController 并从 ProductController[=71] 中定义的方法中传递=],我会用Product模型去查询productstable看有没有匹配的结果[=72] =]
如果有任何匹配结果,我会将它们发送到 JSON 对象内的前端,如果没有任何匹配结果,我会在 JSON 对象内将成功标志设置为 false =] 对象并将其发送到前端
在前端,如果有匹配的结果,我会显示在屏幕上。否则,我将显示“未找到结果!”
我的方法有问题
如果我们只想搜索 产品 table,一切正常。但是,如果稍后我们的客户告诉我们类似 的内容怎么办?“还记得您为产品添加的搜索功能吗?我认为该功能也应该添加到订单中。我认为作为列表用户的订单越来越多,他们也应该能够搜索以前的订单。"
现在,由于我们之前的搜索产品方法是在 ProductController 中使用 Product 模型实现的,当我们向 Orders 添加相同的功能时,我们必须在 ProductsController 中再次执行与 相同的操作]OrdersController 使用 Order 模型。不用几秒钟就明白这会导致代码重复
问题总结
❓ 我们如何在 laravel 中添加一个 API 端点以获得可用于搜索我们数据库中任何 table 并获得结果的搜索功能,而不是将搜索功能限定为特定控制器和相应模型?
一个好的开始是创建一个名为 searchable
的特征,并将其添加到您要搜索的所有模型中,并将不同模型之间的任何共享逻辑放入其中。可能您希望手动允许不同的列,因此在每个模型中您都有一组可搜索的列,您可以在特征中引用这些列。
您的控制器必须指向相关模型并调用搜索特征中的方法。
正如其他人所指出的,这是一个高层次的问题,所以我不会讲得太详细。当然,有上百万种方法可以实现这一点,只需尝试保持共享逻辑就位即可。
背景
让我们考虑一个假设场景。假设我们的数据库中有五个不同的table,
- 客户
- 类别
- 产品
- 订单
- 订单详情
我们的客户希望我们在前端添加一个搜索栏,用户可以在其中搜索特定产品,点击搜索按钮后,匹配的产品必须显示在前端。
我解决这个问题的方法
为了添加上述功能,我遇到了以下策略。
我会添加一个输入框来输入产品名称和一个提交按钮。
按下提交按钮后,将向后端发送 GET 请求。查询参数中会包含用户输入的商品名称
一旦后端收到 GET 请求,我会将其传递给 ProductsController 并从 ProductController[=71] 中定义的方法中传递=],我会用Product模型去查询productstable看有没有匹配的结果[=72] =]
如果有任何匹配结果,我会将它们发送到 JSON 对象内的前端,如果没有任何匹配结果,我会在 JSON 对象内将成功标志设置为 false =] 对象并将其发送到前端
在前端,如果有匹配的结果,我会显示在屏幕上。否则,我将显示“未找到结果!”
我的方法有问题
如果我们只想搜索 产品 table,一切正常。但是,如果稍后我们的客户告诉我们类似 的内容怎么办?“还记得您为产品添加的搜索功能吗?我认为该功能也应该添加到订单中。我认为作为列表用户的订单越来越多,他们也应该能够搜索以前的订单。"
现在,由于我们之前的搜索产品方法是在 ProductController 中使用 Product 模型实现的,当我们向 Orders 添加相同的功能时,我们必须在 ProductsController 中再次执行与 相同的操作]OrdersController 使用 Order 模型。不用几秒钟就明白这会导致代码重复
问题总结
❓ 我们如何在 laravel 中添加一个 API 端点以获得可用于搜索我们数据库中任何 table 并获得结果的搜索功能,而不是将搜索功能限定为特定控制器和相应模型?
一个好的开始是创建一个名为 searchable
的特征,并将其添加到您要搜索的所有模型中,并将不同模型之间的任何共享逻辑放入其中。可能您希望手动允许不同的列,因此在每个模型中您都有一组可搜索的列,您可以在特征中引用这些列。
您的控制器必须指向相关模型并调用搜索特征中的方法。
正如其他人所指出的,这是一个高层次的问题,所以我不会讲得太详细。当然,有上百万种方法可以实现这一点,只需尝试保持共享逻辑就位即可。