Paket ini menyediakan sifat yang menambahkan perilaku yang dapat diurutkan ke model Eloquent.
Nilai kolom order dari record baru suatu model ditentukan oleh nilai maksimum kolom order dari semua record model tersebut + 1.
Paket ini juga menyediakan cakupan kueri untuk mengambil semua catatan dalam urutan yang benar.
Spatie adalah agen desain web di Antwerpen, Belgia. Anda akan menemukan ikhtisar semua proyek sumber terbuka kami di situs web kami.
Pelajari cara membuat paket seperti ini, dengan menonton kursus video premium kami:
Kami menginvestasikan banyak sumber daya untuk menciptakan paket sumber terbuka terbaik di kelasnya. Anda dapat mendukung kami dengan membeli salah satu produk berbayar kami.
Kami sangat menghargai Anda mengirimi kami kartu pos dari kota asal Anda, yang menyebutkan paket kami mana yang Anda gunakan. Anda akan menemukan alamat kami di halaman kontak kami. Kami mempublikasikan semua kartu pos yang diterima di dinding kartu pos virtual kami.
Untuk Laravel 6.x atau PHP 7.x, gunakan versi 3.x dari paket ini.
Paket ini dapat diinstal melalui Composer.
composer require spatie/eloquent-sortable
Di Laravel 5.5 dan yang lebih baru, penyedia layanan akan otomatis terdaftar. Dalam versi kerangka kerja yang lebih lama, cukup tambahkan penyedia layanan di file config/app.php
:
' providers ' => [
...
Spatie EloquentSortable EloquentSortableServiceProvider::class,
];
Secara opsional, Anda dapat mempublikasikan file konfigurasi dengan:
php artisan vendor:publish --tag=eloquent-sortable-config
Ini adalah isi file yang akan dipublikasikan di config/eloquent-sortable.php
return [
/*
* The name of the column that will be used to sort models.
*/
' order_column_name ' => ' order_column ' ,
/*
* Define if the models should sort when creating. When true, the package
* will automatically assign the highest order number to a new model
*/
' sort_when_creating ' => true ,
/*
* Define if the timestamps should be ignored when sorting.
* When true, updated_at will not be updated when using setNewOrder
*/
' ignore_timestamps ' => false ,
];
Untuk menambahkan perilaku yang dapat diurutkan ke model Anda, Anda harus:
SpatieEloquentSortableSortable
.SpatieEloquentSortableSortableTrait
.order_column
. use Spatie EloquentSortable Sortable ;
use Spatie EloquentSortable SortableTrait ;
class MyModel extends Model implements Sortable
{
use SortableTrait;
public $ sortable = [
' order_column_name ' => ' order_column ' ,
' sort_when_creating ' => true ,
];
// ...
}
Jika Anda tidak menetapkan nilai $sortable['order_column_name']
paket akan berasumsi bahwa nama kolom pesanan Anda akan diberi nama order_column
.
Jika Anda tidak menetapkan nilai $sortable['sort_when_creating']
paket akan secara otomatis menetapkan nomor pesanan tertinggi ke model baru;
Dengan asumsi bahwa tabel db untuk MyModel
kosong:
$ myModel = new MyModel ();
$ myModel -> save (); // order_column for this record will be set to 1
$ myModel = new MyModel ();
$ myModel -> save (); // order_column for this record will be set to 2
$ myModel = new MyModel ();
$ myModel -> save (); // order_column for this record will be set to 3
//the trait also provides the ordered query scope
$ orderedRecords = MyModel:: ordered ()-> get ();
Anda dapat mengatur urutan baru untuk semua catatan menggunakan metode setNewOrder
/**
* the record for model id 3 will have order_column value 1
* the record for model id 1 will have order_column value 2
* the record for model id 2 will have order_column value 3
*/
MyModel:: setNewOrder ([ 3 , 1 , 2 ]);
Secara opsional, Anda dapat meneruskan nomor pesanan awal sebagai argumen kedua.
/**
* the record for model id 3 will have order_column value 11
* the record for model id 1 will have order_column value 12
* the record for model id 2 will have order_column value 13
*/
MyModel:: setNewOrder ([ 3 , 1 , 2 ], 10 );
Anda dapat mengubah kueri yang akan dieksekusi dengan meneruskan penutupan sebagai argumen keempat.
/**
* the record for model id 3 will have order_column value 11
* the record for model id 1 will have order_column value 12
* the record for model id 2 will have order_column value 13
*/
MyModel:: setNewOrder ([ 3 , 1 , 2 ], 10 , null , function ( $ query ) {
$ query -> withoutGlobalScope ( new ActiveScope );
});
Untuk mengurutkan menggunakan kolom selain kunci utama, gunakan metode setNewOrderByCustomColumn
.
/**
* the record for model uuid '7a051131-d387-4276-bfda-e7c376099715' will have order_column value 1
* the record for model uuid '40324562-c7ca-4c69-8018-aff81bff8c95' will have order_column value 2
* the record for model uuid '5dc4d0f4-0c88-43a4-b293-7c7902a3cfd1' will have order_column value 3
*/
MyModel:: setNewOrderByCustomColumn ( ' uuid ' , [
' 7a051131-d387-4276-bfda-e7c376099715 ' ,
' 40324562-c7ca-4c69-8018-aff81bff8c95 ' ,
' 5dc4d0f4-0c88-43a4-b293-7c7902a3cfd1 '
]);
Seperti setNewOrder
, setNewOrderByCustomColumn
juga akan menerima argumen pesanan awal opsional.
/**
* the record for model uuid '7a051131-d387-4276-bfda-e7c376099715' will have order_column value 10
* the record for model uuid '40324562-c7ca-4c69-8018-aff81bff8c95' will have order_column value 11
* the record for model uuid '5dc4d0f4-0c88-43a4-b293-7c7902a3cfd1' will have order_column value 12
*/
MyModel:: setNewOrderByCustomColumn ( ' uuid ' , [
' 7a051131-d387-4276-bfda-e7c376099715 ' ,
' 40324562-c7ca-4c69-8018-aff81bff8c95 ' ,
' 5dc4d0f4-0c88-43a4-b293-7c7902a3cfd1 '
], 10 );
Anda juga dapat memindahkan model ke atas atau ke bawah dengan metode berikut:
$ myModel -> moveOrderDown ();
$ myModel -> moveOrderUp ();
Anda juga dapat memindahkan model ke posisi pertama atau terakhir:
$ myModel -> moveToStart ();
$ myModel -> moveToEnd ();
Anda dapat menentukan apakah suatu elemen berada pada urutan pertama atau terakhir:
$ myModel -> isFirstInOrder ();
$ myModel -> isLastInOrder ();
Anda dapat menukar urutan dua model:
MyModel:: swapOrder ( $ myModel , $ anotherModel );
Jika model/tabel Anda memiliki bidang pengelompokan (biasanya kunci asing): id,
user_id
, title, order_column
dan Anda ingin metode di atas mempertimbangkannya, Anda dapat membuat metode buildSortQuery
pada model Anda:
// MyModel.php
public function buildSortQuery ()
{
return static :: query ()-> where ( ' user_id ' , $ this -> user_id );
}
Ini akan membatasi penghitungan pada nilai bidang contoh model.
Setelah pengurutan selesai, sebuah peristiwa ( SpatieEloquentSortableEloquentModelSortedEvent
) dikirimkan yang dapat Anda dengarkan. Ini dapat berguna untuk menjalankan logika pasca-penyortiran seperti membersihkan cache atau tindakan lain yang perlu dilakukan setelah pengurutan.
Acara ini memiliki pembantu isFor
yang memungkinkan Anda dengan mudah memeriksa kelas Eloquent yang telah diurutkan.
Di bawah ini adalah contoh bagaimana Anda dapat mendengarkan acara ini:
use Spatie EloquentSortable EloquentModelSortedEvent as SortEvent ;
class SortingListener
{
public function handle ( SortEvent $ event ): void {
if ( $ event -> isFor (MyClass::class)) {
// ToDo: flush our cache
}
}
}
Paket ini berisi beberapa tes integrasi/asap, yang diatur dengan Orchestra. Tes dapat dijalankan melalui phpunit.
vendor/bin/phpunit
Silakan lihat CHANGELOG untuk informasi lebih lanjut tentang apa yang berubah baru-baru ini.
Silakan lihat KONTRIBUSI untuk rinciannya.
Harap tinjau kebijakan keamanan kami tentang cara melaporkan kerentanan keamanan.
Lisensi MIT (MIT). Silakan lihat File Lisensi untuk informasi lebih lanjut.