web-dev-qa-db-ja.com

Laravel 1ページに複数の改ページ

ページネーションに問題があります。データベースからのデータを含む2つのテーブルがあり、laravel Paginator。

今、私の問題は、たとえばページ2に移動すると?page = 2が追加されますが、最初のテーブルもページ2に移動します。

とにかくこのようなものを取得する方法はありますか?

page_table1={number}&page_table2={number}

そのため、他のテーブルにページ変更を適用しないでください。

32
Melvin Koopmans

残念ながら、今このコードをテストすることはできませんが、ドキュメントとコード(_Illuminate/Pagination/Environment_)を参照すると、次のようなことができると思います。

_# use default 'page' for this
$collection1 = Model::paginate(20);

# use custom 'other_page' for this
$collection2 = Model2::paginate(20);
$collection2->setPageName('other_page');
_

setPageName()メソッドはドキュメントには記載されていませんが、ドキュメントに示されているメソッドと並んでパブリックメソッドであるため、正常に機能するはずです。参照のために、これは宣言です(l。171-180 in _vendor/laravel/framework/src/Illuminate/Pagination/Environment.php_):

_/**
 * Set the input page parameter name used by the paginator.
 *
 * @param  string  $pageName
 * @return void
 */
public function setPageName($pageName)
{
    $this->pageName = $pageName;
}
_

ここで、URLに別のクエリ文字列が追加されることを考慮してください。したがって、ページネーションにそれを考慮するように指示する必要があります。 appends() メソッドを使用します。

_$collection1->appends(array_except(Request::query(), 'page'))->links();

$collection2->appends(array_except(Request::query(), 'other_page'))->links();
_

つまり、すべてのクエリ文字列(Request::query()withoutの結果の配列)で現在のインデックスを含むURLを構築するように各プレゼンターに指示しますページネーターによって使用されます。そうでない場合は、二重値になります)。 array_except()は、渡されたインデックス(2番目のパラメーター)から削除された特定の配列(1番目のパラメーター)を返すLaravel組み込みの配列ヘルパー)です。

できるだけ早くこのコードをテストしようとしますが、動作するはずです。どんな場合でもお知らせください!

20
Damien Pirsy
$publishedArticles = Article::paginate(10, ['*'], 'published');
$unpublishedArticles = Article::paginate(10, ['*'], 'unpublished');

3番目の引数は次のように使用されます。

laravel/public/articles?published = 3

laravel/public/articles?unpublished = 1

38
anonym

これは、Laravel 4。

コントローラー

ページ付けを行う前にページ名を変更します。

Paginator::setPageName('page_a');
$collection_A = ModelA::paginate(10);

Paginator::setPageName('page_b');
$collection_B = ModelB::paginate(10);

表示

同じこと:リンクを印刷する前にページ名を変更します

Paginator::setPageName('page_a');
$collection_A->links();

Paginator::setPageName('page_b');
$collection_B->links();

別のページに移動するときにページの状態を失いたくない場合は、すべてのコレクションの現在のページをリンクに追加します。

Paginator::setPageName('page_a');
$collection_A->appends('page_b', Input::get('page_b',1))->links();

Paginator::setPageName('page_b');
$collection_B->appends('page_a', Input::get('page_a',1))->links();
26
daVe

in laravel 5.3(他のlaravel 5バージョンで動作する可能性があります)、私はこのように使用します:

    $produk = Produk::paginate(5, ['*'], 'produk');
    $region = Region::paginate(5, ['*'], 'region');

ブレードテンプレートでは、位置を保持するために、他の電流を追加リンクします。

    {{$produk->appends(['region' => $region->currentPage()])->links()}}    
    {{$region->appends(['produk' => $produk->currentPage()])->links()}}    
14
mosleim

Laravel 5.7

Model->paginate(10, ['*'], 'paramName');

10 = Max items per page

['*'] = colums

paramName = pagination param name

Illuminate\Database\Eloquent\Builder

7
Rubens

Laravel 5.2では、paginate()を使用するときにページ名を宣言します。

以下は、ページ上の複数のページネータで動作する例です。

  • 他のモデルには必ず異なる_$pageName_を指定してください。

メソッド\Illuminate\Database\Eloquent\Builder::paginate()を参照してください

_/**
 * Get things by ownerId
 *
 * @param integer $ownerId The owner ID.
 *
 * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator Returns a pagination instance.
 */
public function getThings($ownerId)
{
    $builder = \App\Models\Things::where('ownerId', '=', (integer) abs($ownerId));

    // dd([
    //     '__METHOD__' => __METHOD__,
    //     '__FILE__' => __FILE__,
    //     '__LINE__' => __LINE__,
    //     '$ownerId' => $ownerId,
    //     'sql' => $builder->toSql(),
    //     '$builder' => $builder,
    //     'paginate' => $builder->paginate($perPage = null, $columns = ['*'], $pageName = 'p', $page = null),
    // ]);

    return $builder->paginate($perPage = null, $columns = ['*'], $pageName = 'p', $page = null);
}
_

注:_$pageName = 'p'_

使用する:

$var1 = DB1::orderBy('...')->paginate(5, ['*'], '1pagination');

$var2 = DB2::orderBy('...')->paginate(5, ['*'], '2pagination');

Laravel 5.2

2
LauroRafael

anonym の答えは、関連するモデルを持つビューで非常に便利になるように拡張できます。 laravel-5.4でテスト済み:

CustomerController show.blade.phpのビューがあり、次を使用してCustomerモデルを渡すとします。

`` `

return view(['customer' => \App\Customer::find($customerId)]);

`` `各顧客には多くの製品があり、多くの場所があり、自分の製品と場所の両方のページネーションのリストが必要です。次のように表示するだけです。

@foreach($customer->products()->paginate(10,['*'],'productsPage') as $product)
HTML list
@endforeach
{!! $customer->products()->paginate(10,['*'],'productsPage')->links() !!}

@foreach($customer->locations()->paginate(10,['*'],'locationsPage') as $location)
HTML list
@endforeach
{!! $customer->locations()->paginate(10,['*'],'locationsPage')->links() !!}
1
SaidbakR

同じページに2つのインスタンスが存在する可能性があることを知るのに十分ではないため、テーブルを識別する追加のパラメーターを持つように、ページングツールを更新する必要があるように思えます。

URLを介してすべてのテーブルの現在のページを設定するのではなく、テーブルID THENでセッションにアクティブなページ番号を保存するのが理想的です。また。

これが本当にドラフトのコンセプトです。..

// The page would be $tableId + "," + $pageNum
// Passed as a value of "page"
$goTo = "$tableId,$pageNum";
?page=$goTo

次に、テーブルデータを取得している部分に到達すると、次のようになります。

if(!empty($_GET["page"])){
    list($tableId,$pageNum) = explode(",",$_GET["page"]);

    // Store table's active page number
    $_SESSION["_tableBrowser"][$tableId] = $pageNum;


    // Your table reader would then look at the session for the active page number
    // and not what is in $_GET
}
0
Adam