penomboran
Eloque
- penomboran secara manual
- Tunjukkan hasil penomboran
- Tukar keputusan kepada JSON
- Paparan penomboran tersuai
Kaedah contoh pengajiPengenalan
Dalam rangka kerja lain, penomboran boleh menjadi sakit. Penomboran Laravel menggabungkan pembina pertanyaan dan ORM Eloquent untuk menyediakan penomboran set hasil pangkalan data yang mudah dan mudah digunakan. HTML yang dijana melalui paginator adalah serasi dengan Rangka kerja CSS Bootstrap.
Penggunaan Asas
Penomboran Pembina Pertanyaan
Terdapat beberapa cara untuk menomborkan data. Yang paling mudah ialah menggunakan pembina pertanyaan atau kaedah
paginate
Eloquent query. Kaedahpaginate
secara automatik menetapkan offset offset yang sesuai dan nombor had berdasarkan nombor halaman semasa yang dilayari oleh pengguna. Secara lalai, nilai parameter pertanyaanpage
dalam permintaan HTTP dianggap sebagai nombor halaman halaman semasa. Lavarel secara automatik mengesan nilai ini dan secara automatik memasukkannya ke dalam pautan yang dijana oleh penombor.paginate
方法。paginate
方法根据用户浏览的当前页码,自动设置恰当的偏移量 offset 和限制数 limit。默认情况下,HTTP 请求中的page
查询参数值被当作当前页的页码。Lavarel 自动侦测该值,并自动将其插入到分页器生成的链接中。在下面的例子中,传递给
paginate
方法的唯一参数是你希望在每页显示的记录条数。在此处,我们指定要在每页显示15
条数据:<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; use App\Http\Controllers\Controller; class UserController extends Controller{ /** * 显示应用程序中的所有用户。 * * @return Response */ public function index() { $users = DB::table('users')->paginate(15); return view('user.index', ['users' => $users]); } }
{note} 目前,Lavarel 无法高效地执行使用了
groupBy
语句的分页操作。如果你需要使用对使用了groupBy
的结果集分页,建议你手工查询数据库并创建分页。简单分页
如果只需要在你的分页视图中简单地显示『下一页』和『上一页』链接,你可以使用
simplePaginate
方法执行更高效地查询。这在数据很多且不需要在渲染视图时显示每页的页码时非常有用:$users = DB::table('users')->simplePaginate(15);
Eloquent 分页
你还能对 Eloquent 查询结果分页。在下面的例子中,我们将对
User
模型按每页15
条分页。如你所见,其语法与查询构造器分页基本雷同:$users = App\User::paginate(15);
你还可以在调用
paginate
之前,在查询中设置诸如where
从句的其它约束:$users = User::where('votes', '>', 100)->paginate(15);
在 Eloquent 分页中还能使用
Dalam contoh di bawah, satu-satunya parameter yang dihantar ke kaedahsimplePaginate
paginate
ialah bilangan rekod yang anda mahu paparkan pada setiap halaman. Di sini, kami menyatakan bahawa kami mahu memaparkan15
keping data setiap halaman:$users = User::where('votes', '>', 100)->simplePaginate(15);
{note} Pada masa ini, Lavarel tidak dapat melaksanakan operasi dengan cekap yang menggunakan
groupBy
penyata Operasi Paging. Jika anda perlu menomborkan set hasil menggunakangroupBy
, adalah disyorkan agar anda menanya pangkalan data secara manual dan membuat penomboran.Paging mudah
Jika anda hanya perlu memaparkan "halaman seterusnya" dan "halaman seterusnya" dalam halaman anda lihat pautan halaman sebelumnya, anda boleh menggunakan kaedahsimplePaginate
untuk melakukan pertanyaan yang lebih cekap. Ini berguna apabila anda mempunyai banyak data dan tidak perlu memaparkan nombor halaman setiap halaman semasa memaparkan paparan:<div class="container"> @foreach ($users as $user) {{ $user->name }} @endforeach </div> {{ $users->links() }}
🎜🎜🎜🎜🎜Paging fasih🎜🎜Anda juga boleh menomborkan hasil pertanyaan Eloquent. Dalam contoh di bawah, kami akan menomborkan modelPengguna
dengan15
item setiap halaman. Seperti yang anda lihat, sintaks pada asasnya adalah sama seperti penomboran pembangun pertanyaan: 🎜Route::get('users', function () { $users = App\User::paginate(15); $users->withPath('custom/url'); // });
🎜Anda juga boleh menetapkan kekangan lain seperti klausawhere
dalam pertanyaan sebelum memanggilpaginate
: 🎜{{ $users->appends(['sort' => 'votes'])->links() }}
🎜Anda juga boleh menggunakan kaedahsimplePaginate
dalam penomboran Eloquent: 🎜{{ $users->fragment('foo')->links() }}
🎜🎜🎜🎜🎜🎜Buat penomboran secara manual
Kadangkala anda mungkin mahu mencipta penomboran secara manual dan memberikannya set tatasusunan. Ini boleh dicapai dengan mencipta contoh
IlluminatePaginationPaginator
atauIlluminatePaginationLengthAwarePaginator
, bergantung pada keperluan anda. Kelas .IlluminatePaginationPaginator
或IlluminatePaginationLengthAwarePaginator
实例来实现,这有赖于你的需要。.Paginator
类不需要知道结果集的总数;但是,这样一来,这个类就没办法获知最后一页的索引。LengthAwarePaginator
接受和Paginator
几乎相同的参数;不过,它会计算结果集的总数。换句话说,
Paginator
相当于 查询构造器 或 Eloquent 的simplePaginate
方法,而LengthAwarePaginator
相当于paginate
方法。{note} 在手动创建分页实例时,需要人为 “切割” 传递给分页实例的结果数组。如果你对此没有把握,请参考 PHP 的 array_slice 函数。
显示结果集
调用
paginate
方法时,会得到IlluminatePaginationLengthAwarePaginator
实例。调用simplePaginate
方法,得到的是IlluminatePaginationPaginator
实例。这些对象提供了分析结果集的几个方法。 除了这些辅助方法,分页器实例合为迭代器,可以像数组一样循环。因此,当得到结果后,可以使用 Blade 显示数据、渲染分页链接:{{ $users->onEachSide(5)->links() }}
links
方法渲染结果集中剩余页面的链接。每个链接都包含page
URL 变量。记住,links
生成的 HTML 兼容 Bootstrap CSS 框架。自定义分页器 URI
withPath
方法允许你在生成分页链接时自定义 URI 。例如,如果你想生成形如http://example.com/custom/url?page=N
的分页链接,只需要传递custom/url
参数给withPath
方法:Route::get('users', function () { return App\User::paginate(); });
附加参数到分页链接
可以使用
appends
方法,向分页链接中添加查询参数。例如,要在每页链接中添加sort=votes
,只需要这样调用appends
:{ "total": 50, "per_page": 15, "current_page": 1, "last_page": 4, "first_page_url": "http://laravel.app?page=1", "last_page_url": "http://laravel.app?page=4", "next_page_url": "http://laravel.app?page=2", "prev_page_url": null, "path": "http://laravel.app", "from": 1, "to": 15, "data":[ { // 结果集对象 }, { // 结果集对象 } ] }
如果想要向分页器 URL 添加 “哈希片段”,可以使用
fragment
方法。例如,要在每页链接中添加#foo
,只要这样调用fragment
Paginator
tidak perlu mengetahui jumlah set hasil walau bagaimanapun, kelas ini tidak mempunyai cara untuk mengetahui indeks halaman terakhir.LengthAwarePaginator
menerima parameter yang hampir sama sepertiPaginator
walau bagaimanapun, ia mengira jumlah bilangan set hasil. Dalam erti kata lain,Paginator
adalah bersamaan dengan pembina pertanyaan atau kaedahsimplePaginate
Eloquent danLengthAwarePaginator
bersamaan denganpaginate kod > kaedah. 🎜
🎜{note} Apabila membuat tika paging secara manual, anda perlu "memotong" tatasusunan hasil yang dihantar ke tika paging secara manual. Jika anda tidak pasti tentang perkara ini, sila rujuk fungsi array_slice PHP. 🎜
🎜🎜🎜Memaparkan set hasil
🎜 Apabila kaedahpaginate
dipanggil, contohIlluminatePaginationLengthAwarePaginator
akan diperolehi. Panggil kaedahsimplePaginate
dan dapatkan contohIlluminatePaginationPaginator
. Objek ini menyediakan beberapa kaedah untuk menganalisis set hasil. Sebagai tambahan kepada kaedah pembantu ini, contoh kelui digabungkan menjadi iterator yang boleh dilingkarkan seperti tatasusunan. Oleh itu, apabila keputusan diperoleh, anda boleh menggunakan Blade untuk memaparkan data dan memaparkan pautan halaman: 🎜{{ $paginator->links('view.name') }} // Passing data to the view... {{ $paginator->links('view.name', ['foo' => 'bar']) }}
🎜pautan kaedah untuk memaparkan pautan ke halaman yang tinggal dalam set hasil. Setiap pautan mengandungi pembolehubah URL halaman. Ingat, HTML yang dijana oleh pautan
adalah serasi dengan rangka kerja CSS Bootstrap. 🎜🎜URI penomboran tersuai
🎜denganPath kaedah membolehkan anda menyesuaikan URI apabila menjana pautan penomboran. Sebagai contoh, jika anda ingin menjana pautan bernombor seperti http://example.com/custom/url?page=N
, hanya hantar parametercustom/url
ke Kaedah < code>withPath: 🎜php artisan vendor:publish --tag=laravel-pagination
🎜Tambah parameter pada pautan paging
🎜Anda boleh menggunakanapends kod> Kaedah untuk menambah parameter pertanyaan pada pautan penomboran. Sebagai contoh, untuk menambah
sort=votes
pada setiap pautan halaman, cuma panggiltambah
seperti ini:🎜use Illuminate\Pagination\Paginator;public function boot(){ Paginator::defaultView('view-name'); Paginator::defaultSimpleView('view-name'); }
🎜Jika anda ingin menambah "serpihan cincang" pada URL penomboran , Anda boleh menggunakan kaedahfragment
. Contohnya, untuk menambah#foo
pada setiap pautan halaman, cuma panggil kaedahfragment
seperti ini: 🎜rrreee🎜🎜Ubah Saiz Tetingkap Pautan Penomboran
Anda boleh mengawal bilangan pautan tapak yang dipaparkan pada setiap sisi "tetingkap" penomboran. Secara lalai, tiga pautan muncul pada setiap sisi pautan penomboran utama. Nilai ini boleh ditukar menggunakan kaedah
rrreeeonEachSide
:onEachSide
方法改变这个数值:将结果转换为 JSON
Laravel 分页器类实现了
rrreeeIlluminateContractsSupportJsonable
接口契约,提供了toJson
方法,能够方便地将分页结果转换为 JSON 。还可以通过自路由或控制器操作返回分页器实例来将其转换为 JSON :来自分页器的 JSON 将包括诸如
rrreeetotal
,current_page
,last_page
等元数据信息。实际结果对象将通过 JSON 数组的data
键提供。以下是通过自路由中返回分页器实例的方式创建 JSON 的例子:自定义分页视图
默认情况下,渲染视图以显示分页链接与 Bootstrap CSS 框架兼容。如果你不使用 Bootstrap,可以随心所欲地定制自己的视图来渲染这些链接。在调用分页器实例的
rrreeelinks
方法时,将视图名称作为传递给它的第一个参数:自定义分页视图的最简方法是使用
rrreeevendor:publish
命令将它们输出到resources/views/vendor
文件夹:此命令将在
resources/views/vendor/pagination
文件夹放置这些视图。内置在该文件夹下的bootstrap-4.blade.php
文件提供了默认的分页视图。可以编辑此文件以修改分页 HTML。如果想要定义不同的文件作为默认分页视图,需要在
AppServiceProvider
中使用分页器的defaultView
和defaultSimpleView
rrreeeTukar hasil kepada JSON
Kelas paginator Laravel melaksanakan kontrak antara mukaIlluminateContractsSupportJsonable
dan menyediakan kaedahtoJson
, yang boleh menukar halaman dengan mudah keputusan ke dalam JSON. Ia juga boleh ditukar kepada JSON dengan mengembalikan tika kelui daripada laluan atau tindakan pengawal:rrreeeJSON daripada kelui akan menyertakan perkara sepertijumlah ,halaman_semasa, < kod>halaman_akhir dan maklumat metadata lain. Objek hasil sebenar akan diberikan melalui kunci data
tatasusunan JSON. Berikut ialah contoh mencipta JSON dengan mengembalikan tika penomboran daripada laluan: 🎜rrreee🎜🎜🎜🎜Paparan penomboran tersuai
🎜Secara lalai, memaparkan paparan untuk menunjukkan pautan bernombor adalah serasi dengan rangka kerja CSS Bootstrap. Jika anda tidak menggunakan Bootstrap, jangan ragu untuk menyesuaikan paparan anda sendiri untuk memaparkan pautan ini. Apabila memanggil kaedahpautan
contoh penomboran, berikan nama paparan sebagai hujah pertama: 🎜rrreee🎜Cara paling mudah untuk menyesuaikan paparan bernombor ialah menggunakanvendor:publish< The / arahan code> akan mengeluarkannya ke folder
resources/views/vendor
: 🎜rrreee🎜Arahan ini akan meletakkan paparan ini dalam folderresources/views/vendor/penomboran
. Failbootstrap-4.blade.php
yang dibina ke dalam folder ini menyediakan paparan penomboran lalai. Fail ini boleh diedit untuk mengubah suai HTML penomboran. 🎜🎜Jika anda ingin mentakrifkan fail lain sebagai paparan halaman lalai, anda perlu menggunakan kaedahdefaultView
dandefaultSimpleView
penombor dalamAppServiceProvider
: 🎜rrreee 🎜🎜🎜🎜🎜🎜Kaedah instance paginator
Setiap instance paginator menyediakan kaedah berikut untuk mendapatkan maklumat paging tambahan: :
Kaedah Penerangan $results->count() Dapatkan bilangan data pada halaman semasa. $results->count()
获取当前页数据数量。 $results->currentPage()
获取当前页页码。 $results->firstItem()
获取结果集中第一条数据的结果编号。 $results->getOptions()
获取分页器选项。 $results->getUrlRange($start, $end)
创建分页 URL 范围。 $results->hasMorePages()
是否有多页。 $results->lastItem()
获取结果集中最后一条数据的结果编号。 $results->lastPage()
获取最后一页的页码(在 simplePaginate
中无效)。$results->nextPageUrl()
获取下一页的 URL 。 $results->onFirstPage()
当前而是否为第一页。 $results->perPage()
每页的数据条数。 $results->previousPageUrl()
获取前一页的 URL。 $results->total()
数据总数(在 simplePaginate
🎜🎜$results->currentPage()
Dapatkan nombor halaman semasa. 🎜🎜🎜$results->firstItem()
Dapatkan nombor hasil bagi sekeping data pertama dalam set hasil. 🎜🎜🎜$results->getOptions()
Dapatkan pilihan penomboran. 🎜🎜🎜$results->getUrlRange($start, $end)
Buat julat URL yang dinomborkan. 🎜🎜🎜$results->hasMorePages()
Sama ada terdapat berbilang halaman. 🎜🎜🎜$results->lastItem()
Dapatkan nombor hasil bagi sekeping data terakhir dalam set hasil. 🎜🎜🎜$results->lastPage()
Dapatkan nombor halaman halaman terakhir (tidak sah dalam 🎜🎜🎜simplePaginate
).$results->nextPageUrl()
Dapatkan URL halaman seterusnya. 🎜🎜🎜$results->onFirstPage()
Semasa dan sama ada ia adalah halaman pertama. 🎜🎜🎜$results->perPage()
Bilangan item data setiap halaman. 🎜🎜🎜$results->previousPageUrl()
Dapatkan URL halaman sebelumnya. 🎜🎜🎜$results->total() Jumlah bilangan data (tidak sah dalam simplePaginate
).$results->url($page)
Dapatkan URL halaman yang ditentukan.