2017-02-19 92 views
13

我顯示的是從Algolia獲得的分頁結果。我在我的控制器中有兩個查詢,我分頁。這就是我從控制器將數據發送到視圖:Laravel 5.3 - 單個頁面上的多個分頁不起作用

public function index(Request $request) 
{ 
    if(!$request->q && !$request->page){ 
     return redirect('/'); 
    } 

    $videos = Video::search($request->q)->paginate(1); 
    $videosCollection = $videos->getCollection(); 

    return fractal() 
     ->collection($videosCollection) 
     ->parseIncludes(['player']) 
     ->transformWith(new VideoTransformer) 
     ->paginateWith(new IlluminatePaginatorAdapter($videos)) 
     ->toArray(); 
} 

所以後來當我搜索例如用於'rene'的結果顯示在URL http://videoapp.app/search?q=rene 而且,我得到看起來像這樣的數據:

{ 
    data: [ 
    { 
     id: 46, 
     description: null, 
     views: 0, 
     created_at: "1 month ago", 
     player: { 
     data: { 
      id: 34, 
      image: "15889ca47e557c12240142_1013305815416003_5199651181367705874_n.jpg", 
      first_name: "Bruno", 
      last_name: "Hendricks" 
    } 
    } 
} 
], 
meta: { 
    pagination: { 
    total: 2, 
    count: 1, 
    per_page: 1, 
    current_page: 1, 
    total_pages: 2, 
    links: { 
     next: "http://videoapp.app/search?query=rene&page=2" 
     } 
    } 
    } 
} 

但是爲下一頁創建的分頁鏈接是"http://videoapp.app/search?query=rene&page=2",如果我點擊它,元數據會發生變化,我得到整個表的結果,而不僅僅是我的第一個查詢的結果是在本例中爲'rene'。如果我另一方面在瀏覽器http://videoapp.app/search?q=rene&page=2中輸入網址,那麼它的工作原理應該是這樣。 我如何更改這些生成的鏈接,以便它能夠正常工作?

我也試圖與SO,另一個例子再次沒有爲我工作:

控制器:

if(!$request->q && !$request->page){ 
     return redirect('/'); 
    } 

    $players = Player::search($request->q) 
       ->paginate(1); 

    $videos = Video::search($request->q) 
       ->paginate(1); 
    $videos->setPageName('videos'); 

查看

{{ $videos->appends(array_except(Request::only('q'), 'page'))->links() }} 

{{ $players->appends(array_except(Request::only('q'), 'videos'))->links() }} 

我也tr從答案IED中建議:

public function index(Request $request) 
{ 
    $q = $request->q; 
    $videosPage = $request->vpage; 
    $playersPage = $request->ppage; 

    if (! $request->q) { 
     return redirect('/'); 
    } 

    $players = Player::search($q) 
     ->paginate(1, 'ppage') 
     ->appends(['q' => $q, 'vpage' => $videosPage]); 
    $videos = Video::search($q) 
     ->paginate(1, 'vpage') 
     ->appends(['q' => $q, 'ppage' => $playersPage]); 

    return view('search.index', [ 
     'players' => $players, 
     'videos' => $videos, 
    ]); 
} 

但也沒有工作,當我點擊一個鏈接,供玩家會回到視頻搜索結果的例子。似乎無法找到這個問題的任何解決方案?

+0

這個問題已經在這裏回答https:// stackoverflow.com。com/questions/24086269/laravel-multiple-pagination-in-one-page –

回答

0
if (!$request->q) { 
    return redirect('/'); 
} 

這是造成您的問題,當你按下PAGINATE鏈接它將取代?Q =東西?頁= 2,這將導致你的函數重定向。

使用別的例如:

if(!request->q && !request->page){ 
    return redirect('/'); 
} 
+1

我在Player模型中沒有任何搜索方法,我只是在我的模型中使用'''Laravel \ Scout \ Searchable'''它。 – Leff

+0

並使用paginate(1);而不是分頁(1,['*'],'videos'); –

+1

它仍然沒有工作,因爲它應該是,在創建分頁鏈接,並沒有錯誤,但我沒有得到兩個單獨的查詢,分頁鏈接從視頻中業績不斷運動員比賽成績,我想有單獨的結果和每個選項卡中的分頁,供玩家和視頻使用。 – Leff

0

鴻溝玩家或視頻的窗口 與< - - I幀 - - >或< ---框架 - >使用不同的方法到控制器中輸出將出現在同一個窗口中。

+1

我不知道該怎麼做,你能舉一些代碼示例嗎? – Leff

5

問題是您需要3個單獨的查詢字符串值(搜索項的「q」和每個分頁程序的頁碼),並且默認分頁鏈接將其清除,只保留與當前分頁程序對應的一個。

我想試試這個:

public function index(Request $request) 
{ 
    $q = $request->q; 
    $videosPage = $request->vpage; 
    $playersPage = $request->ppage; 

    if (! $request->q) { 
     return redirect('/'); 
    } 

    $players = Player::search($q) 
     ->paginate(1, 'ppage') 
     ->appends(['q' => $q, 'vpage' => $videosPage]); 
    $videos = Video::search($q) 
     ->paginate(1, 'vpage') 
     ->appends(['q' => $q, 'ppage' => $playersPage]); 

    return view('search.index', [ 
     'players' => $players, 
     'videos' => $videos, 
    ]); 
} 

這樣,每個分頁程序都有自己的頁面名稱,並保持其他一個和查詢字符串搜索詞。

+1

它似乎對視頻正常工作,但當我切換到播放器選項卡並開始點擊新頁面時,它會返回到視頻選項卡和視頻結果。 – Leff

+0

@好的,點擊paginator鏈接會刷新瀏覽器並顯示新請求的響應,所以「活動標籤狀態」將不會被保留。似乎最簡單的方法是AJAX請求,然後......實際上,爲什麼不使用Algolia JavaScript客戶端呢? – alepeino

+1

我正在使用Algolia javascript客戶端進行自動完成,不確定如何使用它來解決此問題。 – Leff

相關問題