簡體   English   中英

Laravel過濾結果已經從MySQL中獲取

[英]Laravel filtering results already retrieved from mysql

我正在使用以下方法從數據庫中提取所有供應商:

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

然后,我希望用戶能夠進行進一步過濾,而不必再次針對其應用的每個過濾器查詢數據庫。

例如,在查詢返回的數據中,列之一是vendor_type_id。 在用戶界面中,用戶可以過濾按供應商類型帶回的供應商,例如在食品供應商旁邊的方框中打勾,並進一步過濾結果而無需接觸數據庫。

所以我真的想過濾從Laravel返回的$ data對象。

我怎樣才能做到這一點?

如果要在查詢數據庫的請求結束后過濾集合,則應在客戶端解決此問題。

變量$data僅在服務器端可用。 若要將數據從一個請求持久保存到服務器上的另一個請求,則必須將其存儲在當前會話中(使用Session::put()Session::get() )或以某種方式緩存。 在大多數情況下,這並不是很好,因為對數據庫的任何更改都會導致存儲數據和會話數據之間的不一致。

處理此問題而不接觸數據庫的最佳解決方案是發送數據(可能以JSON格式),然后使用JavaScript處理UI內的任何其他過濾。

編輯

可以使用remember方法在指定的時間內緩存查詢結果:

$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;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM