Laravel过滤结果已经从mysql中检索出来

时间:2014-11-11 15:23:24

标签: php mysql laravel laravel-4

我使用以下方式从我的数据库中取出所有供应商:

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

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

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

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

我该怎么做?

1 个答案:

答案 0 :(得分:2)

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

变量$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;
});
相关问题