У меня проблемы с разбиением на страницы. У меня есть две таблицы с данными из базы данных, и я разбил ее на страницы с помощью laravel Paginator.
Теперь моя проблема в том, когда вы идете, например, на страницу 2, она добавляет? Page = 2, но это делает первую таблицу также на странице 2.
Есть ли способ получить что-то вроде этого?
page_table1={number}&page_table2={number}
поэтому вы не применяете изменение страницы в других таблицах.
К сожалению, я не могу проверить этот код прямо сейчас, но просматривая документы и код (в 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()
без текущего индекса, используемого paginator, или вы получите двойное значение). array_except()
является встроенным помощником массива Laravel, который возвращает заданный массив (1-й параметр), очищенный от переданного индекса (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();
$publishedArticles = Article::paginate(10, ['*'], 'published'); $unpublishedArticles = Article::paginate(10, ['*'], 'unpublished');
Третий аргумент используется следующим образом:
Laravel / общественные / статьи? опубликовано = 3
Laravel / государственные / статьи? неопубликованные = 1
В 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'
в 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()}}
Использование:
$var1 = DB1::orderBy('...')->paginate(5, ['*'], '1pagination'); $var2 = DB2::orderBy('...')->paginate(5, ['*'], '2pagination');
Для Laravel 5.2
Мне кажется, что вам нужно обновить инструмент подкачки, чтобы он имел дополнительный параметр, который идентифицирует таблицу, поскольку он недостаточно умен, чтобы знать, что он может иметь 2 экземпляра себя на одной странице .. DOH!
Вместо того, чтобы устанавливать текущую страницу для всех таблиц через URL-адрес, в идеале вы хотите сохранить номер активной страницы в сеансе по идентификатору таблицы 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 }