【问题标题】:Laravel filtering results already retrieved from mysqlLaravel 过滤结果已经从 mysql 中检索到
【发布时间】:2014-11-11 15:23:23
【问题描述】:

我正在使用以下方法从我的数据库中获取所有供应商:

$q = Input::get('filter');
$Supplier = new Supplier;
$data = $Supplier->where('name', 'LIKE', '%'.$q['filters'][0]['value'].'%')->get();

然后我希望用户能够进一步过滤,但不必为他们应用的每个过滤器再次查询数据库。

例如,从查询返回的数据中,其中一列是supplier_type_id。在 UI 中,用户可以过滤按供应商类型返回的供应商,例如勾选食品供应商旁边的框,它会进一步过滤结果而不接触数据库。

所以我真的想过滤从 Laravel 返回的 $data 对象。

我该怎么做?

【问题讨论】:

标签: php mysql laravel laravel-4


【解决方案1】:

如果您想在查询数据库的请求结束后过滤集合,那么您应该在客户端处理这些问题。

变量$data 仅在服务器端可用。要将数据从一个请求持久保存到服务器上的另一个请求,您必须将其存储在当前会话中(使用Session::put()Session::get())或以某种方式缓存它。在大多数情况下,这并不是很好,因为对数据库的任何更改都会导致存储数据和会话数据之间的不一致。

在不接触数据库的情况下处理此问题的最佳解决方案是发送数据(可能为 JSON 格式),然后使用 JavaScript 处理 UI 内的任何其他过滤。

编辑

可以使用remember 方法在指定时间内缓存查询结果:

$data = $Supplier->where('name', 'LIKE', '%'.$q['filters'][0]['value'].'%')->remember(60)->get();

在上面的示例中,查询结果将被缓存一小时,因此该小时内的任何请求都将从缓存中获取数据,而不是从数据库中获取数据。您可以查看 Caching QueriesCache configuration and usage Laravel 文档了解更多信息。

然后您可以使用filter 闭包进一步过滤缓存的集合:

$supplierTypeId = Input::get('supplier_type_id');

$data = $data->filter(function($item) use ($supplierTypeId)
{
    return $item->supplier_type_id == $supplierTypeId;
});

【讨论】:

  • 数据库中的数据可能每年会更改一两次,所以这不是问题。
  • 如果你真的想避免接触数据库,最好的办法可能是将你的查询缓存一段时间(你应该决定应该多长时间)。
猜你喜欢
  • 2018-07-29
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2015-04-04
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多