私はイベント予約システムで作業しています。ユーザーが日付範囲を検索すると、私のEvent
モデルの中で、イベントが利用可能かどうかをチェックする関数を使用します。私の検索機能は現在次のように機能しています:Laravelがクエリ結果をループしてページをめくる
$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コレクションをページ単位コレクションに変換する方法はありますか?
ありがとうございます!
P.S. $request
をappends()
を使用するビューに渡すので、ページング時にクエリ文字列パラメータを保持できます。
EDIT:代わりに、
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
を渡す: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;
}
クエリビルダで ' - > whereBetween( 'event_date'、[$ from、$ to])'を使用できませんか?あなたの 'is_available($ from、$ to) '関数が何をするのかわかりませんが、手動でチェックしていると思います。 –
@Ciccio残念ながら。イベントが利用できない期間を別のテーブルに保存します。このテーブルには、イベントのIDと、使用不可の開始日と終了日が含まれます。メソッドが私の質問に追加されました。 –