我正在制作一个活动预订系统。当用户搜索日期范围时,我在Event
模型中使用一个函数来检查事件是否可用。我的搜索功能目前的工作原理如下:
$events = Event::where('name', 'LIKE', '%' . $request->get('term') . '%')
->where('accepted',1)
->orWhere('description', 'LIKE', '%'.$request->get('term').'%')
->orWhere('city', 'LIKE', '%'.$request->get('term').'%')->paginate(15);
$availableEvents = new Collection();
if ($request->get('from') !== '' AND $request->get('to') !== '') {
foreach($events as $key => $event) {
if ($event->is_available($request->get('from'), $request->get('to'))) {
$availableEvents->add($event);
}
}
}
else {
$availableEvents = $events;
}
return view('frontend.events.results', ['events' => $availableEvents, 'request' => $request]);
我无法检查查询构建器中的可用性,因此我必须循环访问。我正在使用Illuminate\Database\Eloquent\Collection
,因为我无法从查询构建器中获取的分页内容中删除事件。
有没有办法将Eloquent Collection转换为分页集合?
提前致谢!
P.S。我将$request
传递给视图以使用appends()
,因此我可以在分页期间保留查询字符串参数。
编辑:is_available
功能
public function is_available($from, $to) {
$from = Carbon::createFromFormat('d-m-Y', $from);
$to = Carbon::createFromFormat('d-m-Y', $to);
foreach($this->not_availables as $notAvailable) {
$notAvailableFrom = Carbon::createFromFormat('Y-m-d', $notAvailable->from);
$notAvailableTo = Carbon::createFromFormat('Y-m-d', $notAvailable->to);
if ($from->gte($notAvailableFrom) OR $to->lte($notAvailableTo)) {
return false;
}
}
return true;
}
答案 0 :(得分:1)
您可以手动创建paginator
您可以像这样使用Illuminate\Pagination\LengthAwarePaginator
:
use \Illuminate\Pagination\LengthAwarePaginator;
...
$page = $request->get('page', 1);
$limit = 10;
$paginator = new LengthAwarePaginator(
$availableEvents->forPage($page, $limit), $availableEvents->count(), $limit, $page, ['path' => $request->path()]
);
然后将$paginator
与您的观点一起传递,而不是$availableEvents
。在您的视图中,您仍然拥有$events
,您可以使用$events->render();
呈现分页,并像往常一样从$request
传递路线参数。