2016-03-21 10 views
2

私はイベント予約システムで作業しています。ユーザーが日付範囲を検索すると、私の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. $requestappends()を使用するビューに渡すので、ページング時にクエリ文字列パラメータを保持できます。

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; 
} 
+0

クエリビルダで ' - > whereBetween( 'event_date'、[$ from、$ to])'を使用できませんか?あなたの 'is_available($ from、$ to) '関数が何をするのかわかりませんが、手動でチェックしていると思います。 –

+1

@Ciccio残念ながら。イベントが利用できない期間を別のテーブルに保存します。このテーブルには、イベントのIDと、使用不可の開始日と終了日が含まれます。メソッドが私の質問に追加されました。 –

答えて

1

は手動であなたがこのようなIlluminate\Pagination\LengthAwarePaginatorを使用することができpaginator

作成することができますあなたの$availableEventsのあなたのビューにまだ$eventsがある場合は、$events->render();でページ番号をレンダリングし、通常通りに$requestのルートパラメータを渡すことができます。

+1

完全に機能しました。どうもありがとう! –

関連する問題