Php 已从mysql检索到Laravel筛选结果

Php 已从mysql检索到Laravel筛选结果,php,mysql,laravel,laravel-4,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。在UI中,用户可

我正在使用以下工具从我的数据库中取出所有供应商:

$q = Input::get('filter');
$Supplier = new Supplier;
$data = $Supplier->where('name', 'LIKE', '%'.$q['filters'][0]['value'].'%')->get();
然后,我希望用户能够进一步过滤,但不必再次查询数据库中他们应用的每个过滤器

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

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


我如何才能做到这一点?

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

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

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

编辑 可以使用
记住
方法将查询结果缓存指定的时间:

$data = $Supplier->where('name', 'LIKE', '%'.$q['filters'][0]['value'].'%')->remember(60)->get();
在上面的示例中,查询结果将被缓存一小时,因此该小时内的任何请求都将从缓存而不是数据库中获取数据。有关更多信息,请参阅和Laravel文档

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

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

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

如果我理解正确的话,你和我遇到了同样的问题。请阅读我的问题。数据库中的数据可能会每年更改一次或两次,因此这不是问题。如果您真的想避免接触数据库,最好的方法可能是将查询缓存一段时间(您应该决定应该多长时间)。