2016-03-21 4 views
2

Ich arbeite an einem Event-Buchungssystem. Wenn der Benutzer nach einem Datumsbereich sucht, verwende ich eine Funktion in meinem Event-Modell, die überprüft, ob das Ereignis verfügbar ist. Meine Suchfunktion funktioniert derzeit wie folgt:Laravel Schleife Abfrage Ergebnis, dann paginieren

Ich kann die Verfügbarkeit im Query Builder nicht überprüfen, also muss ich durchlaufen. Ich verwende eine Illuminate\Database\Eloquent\Collection, weil ich Ereignisse aus der paginierten Sache, die ich vom Abfrage-Generator erhalte, nicht entfernen kann.

Gibt es eine Möglichkeit, die Eloquent Collection in eine paginierte Collection zu konvertieren?

Vielen Dank im Voraus!

P.S. Ich übergebe $request an die Ansicht, appends() zu verwenden, damit ich die Abfrage-Zeichenfolge-Parameter während Paginierung beibehalten kann.

EDIT: Die is_available Funktion

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

Kannst du '-> whereBetween ('event_date', [$ from, $ to])' 'in deinem Query Builder verwenden? Wir können nicht sehen, was Ihre 'is_available ($ from, $ to)' Funktion tut, aber ich gehe davon aus, dass Sie es manuell überprüfen. –

+1

@Ciccio Leider nicht. Wir speichern die Zeiträume, in denen Ereignisse nicht in einer separaten Tabelle verfügbar sind. Diese Tabelle enthält die ID des Ereignisses und ein Datum von und bis zur Nichtverfügbarkeit. Methode wurde zu meiner Frage hinzugefügt. –

Antwort

1

können Sie manuell eine paginator

erstellen Sie Illuminate\Pagination\LengthAwarePaginator wie diese verwenden:

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()] 
); 

dann die $paginator zusammen mit Ihrer Ansicht nach passieren, anstatt von Ihrem $availableEvents. Aus Ihrer Sicht haben Sie immer noch $events, Sie können die Seitennummerierung mit $events->render(); rendern und die Routenparameter wie gewohnt von $request weiterleiten.

+1

Total funktioniert. Danke vielmals! –