[英]Laravel, how to sort and paginate of loop array
我在控制器中有此代碼,所以我需要使用距離進行分頁和排序,我不知道該怎么做。
$stores = [];
foreach (session('storeinfo') as $storeInfo) {
$store = Storeinfo::find($storeInfo['id']);
if ($store) {
$store->distance = $storeInfo['distance'];
$stores[] = $store;
$stores = collect([]);
if (!Collection::hasMacro('paginate')) {
Collection::macro('paginate', function ($perPage = 25, $page = null, $options = []) {
$options['path'] = $options['path'] ?? request()->path();
$page = $page ?: (Paginator::resolveCurrentPage() ?: 1);
return new LengthAwarePaginator(
$this->forPage($page, $perPage)->values(),
$this->count(),
$perPage,
$page,
$options
);
});
}
}
}
return view('stores.archive',compact('stores'));
我使用以下方法將ID放入會話中:
$allstores= Storeinfo::all();
foreach ($allstores as $allstore) {
Session::push('storeinfo', [
'id' => $allstore->id,
'distance' => $miles
]);
}}
$ mile來自距離的計算,請在此處輸入代碼
首先,我將創建您的$stores
數組的集合實例:
$stores = collect([]);
我更喜歡使用集合的push()
API添加項目:
$stores->push($store);
其次,集合實例未提供本機分頁的方式,因此您需要添加一個宏:
use Illuminate\Support\Collection;
use Illuminate\Pagination\Paginator;
use Illuminate\Pagination\LengthAwarePaginator;
...
if (!Collection::hasMacro('paginate')) {
Collection::macro('paginate', function ($perPage = 25, $page = null, $options = []) {
$options['path'] = $options['path'] ?? request()->path();
$page = $page ?: (Paginator::resolveCurrentPage() ?: 1);
return new LengthAwarePaginator(
$this->forPage($page, $perPage)->values(),
$this->count(),
$perPage,
$page,
$options
);
});
}
我親自在AppServiceProvider
添加了上面的宏,以便可以在項目中的任何地方使用它。 它應該位於app/Providers
目錄中。
要進行分頁,只需要調用剛創建的paginate()
宏即可:
$stores->paginate(15);
如果您希望設置當前頁面或路徑,可以這樣做:
$stores->paginate(15, 1, ['path' => 'your/custom/path']);
要進行排序,只需使用所需的sortBy方法即可實現結果。
根據文檔, sortBy
采用一個字符串:
$sorted = $collection->sortBy('price');
或回調:
$sorted = $collection->sortBy(function ($product, $key) {
return count($product['colors']);
});
該方法, sortByDesc()
的工作方式相同sortBy()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.