2016-07-01 9 views
6

Ich habe eine Suchmethode, die mehrere Modelle durchsucht. Der Einfachheit halber habe ich zwei Modelle hinzugefügt, nach denen ich suche.Wie mehrere Modelle in Laravel paginieren

Ich möchte die beiden Modelle kombinieren, um ihre Ergebnisse zu paginieren.

Hier ist, was ich gerade mache.

public function search(Request $request) 
{ 
    $query = $request->get('q'); 
    $threads = Thread::where('title', 'LIKE', "%{$query}%")->get(); 
    $posts = Post::where('body', 'LIKE', "%{$query}%")->get(); 
    $results = array_merge($threads->toArray(), $posts->toArray()); 
    $results = new Paginator($results, 10); 

    return view('pages.search', compact('query', 'results')); 
} 

Das funktioniert, aber ich fühle mich wie das ist wirklich ineffizient und könnte verbessert werden. Gibt es einen besseren Weg, dies zu tun?

Antwort

6

diesen Controller versuchen,

<?php namespace App\Http\Controllers; 
use Illuminate\Pagination\LengthAwarePaginator; 
use Illuminate\Support\Collection; 

class SearchController extends Controller { 
public function search(Request $request){ 
    $query = $request->get('q'); 
    $threads = Thread::where('title', 'LIKE', "%{$query}%")->get(); 
    $posts = Post::where('body', 'LIKE', "%{$query}%")->get(); 
    $searchResults = array_merge($threads->toArray(), $posts->toArray()); 
    //Get current page form url e.g. &page=6 
    $currentPage = LengthAwarePaginator::resolveCurrentPage(); 

    //Create a new Laravel collection from the array data 
    $collection = new Collection($searchResults); 

    //Define how many items we want to be visible in each page 
    $perPage = 10; 

    //Slice the collection to get the items to display in current page 
    $currentPageSearchResults = $collection->slice($currentPage * $perPage, $perPage)->all(); 

    //Create our paginator and pass it to the view 
    $paginatedSearchResults= new LengthAwarePaginator($currentPageSearchResults, count($collection), $perPage); 

    return view('pages.search', compact('query', '$searchResults')); 
} 
} 

Ihrer Ansicht search.blade.php

<?php echo $query->render(); ?> 

Reference

+0

Es gibt einen Fehler im Code. Es sollte slice (($ currentPage-1) * $ perPage) sein. Sonst werden Sie nie die ersten Ergebnisse erhalten. –

-1

Sie können 'DataTables' überprüfen, um Daten von der Front-End-Seite zu paginieren. https://datatables.net/

+0

Das ist nichts mit dem Schrift Ende zu tun. Bitte lesen Sie die Frage erneut. – Enijar