Подтвердить что ты не робот

Laravel Множественная разбивка на одну страницу

У меня проблемы с разбиением на страницы. У меня есть две таблицы с данными из базы данных, и я разбил ее на страницы с помощью laravel Paginator.

Теперь моя проблема в том, когда вы переходите, например, на страницу 2, она добавляет? page = 2, но это делает первую таблицу также на странице 2.

Есть ли способ получить что-то вроде этого?

page_table1={number}&page_table2={number}

чтобы вы не применяли изменение страницы в других таблицах.

4b9b3361

Ответ 1

К сожалению, я не могу проверить этот код прямо сейчас, но просматривая документы и код (в 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() не документируется в документах, но он является общедоступным методом наряду с указанными в документации, поэтому он должен работать нормально. FOR, это объявление (1. 171-180 в 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();

То есть, сообщите каждому Presenter о создании URL-адреса со всеми строками запроса (массив, полученный в результате Request::query() без текущего индекса, используемого в качестве указателя, или вы получите двойное значение). array_except() - это встроенный помощник массива Laravel, который возвращает заданный массив (1-й параметр), очищенный от переданного индекса (2-й параметр).

Я постараюсь проверить этот код, как только смогу, но он должен работать. Дайте мне знать в любом случае!

Ответ 2

Это простое решение, которое я нашел на Laravel 4.

контроллер

Измените имя страницы перед тем, как сделать paginator:

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

Ответ 3

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

Третий аргумент используется следующим образом:

Laravel/государственные/статьи? Опубликовано = 3

Laravel/государственный/статьи? Неопубликованный = 1

Ответ 4

В 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'

Ответ 5

в laravel 5.3 (maibe, работающий в другой версии laravel 5), я использую вот так:

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

и в шаблоне лопастей добавьте токи других для сохранения позиции:

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

Ответ 6

Использование:

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

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

Для Laravel 5.2

Ответ 7

Мне кажется, что вам нужно обновить инструмент подкачки, чтобы он имел дополнительный параметр, который идентифицирует таблицу, так как он недостаточно умен, чтобы знать, что на одной странице могут быть два экземпляра. DOH!

Вместо того, чтобы устанавливать текущую страницу для всех таблиц через URL-адрес, в идеале вы хотите сохранить номер активной страницы в сеансе по идентификатору таблицы THEN, ваш script должен беспокоиться только о инструкциях и не беспокоиться о том, чтобы обеспечить он также содержит существующие номера страниц.

Вот действительно проект концепции....

// 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 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
}

Ответ 8

Ответ аноним может быть расширен, чтобы быть очень удобным в представлениях, которые связанных моделей. проверено в

Предположим, что у нас есть представление для CustomerController show.blade.php, и мы передаем ему модель Customer, используя:

`` `

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

`` ` У каждого Клиента есть много Продуктов, и у них много мест, и мы хотим, чтобы список с разбивкой на страницы как с его продуктами, так и с местами, просто мы можем сделать это в виде, например:

  @foreach ($ customer- > products() - > paginate (10, ['*'], 'productsPage') в качестве $product)
Список HTML
@endforeach
{!! $customer > products() - > paginate (10, ['*'], 'productsPage') - > links()!!}

@foreach ($ customer- & location() - > paginate (10, ['*'], 'locationsPage') в качестве $location)
Список HTML
@endforeach
{!! $customer > location() - > paginate (10, ['*'], 'locationsPage') - > links()!!}
Код>