Dieses Paket stellt eine Eigenschaft bereit, die einem Eloquent-Modell sortierbares Verhalten hinzufügt.
Der Wert der Auftragsspalte eines neuen Datensatzes eines Modells wird durch den Maximalwert der Auftragsspalte aller Datensätze dieses Modells + 1 bestimmt.
Das Paket bietet außerdem einen Abfragebereich, um alle Datensätze in der richtigen Reihenfolge abzurufen.
Spatie ist eine Webdesign-Agentur in Antwerpen, Belgien. Eine Übersicht aller unserer Open-Source-Projekte finden Sie auf unserer Website.
Erfahren Sie, wie Sie ein Paket wie dieses erstellen, indem Sie sich unseren Premium-Videokurs ansehen:
Wir investieren viele Ressourcen in die Erstellung erstklassiger Open-Source-Pakete. Sie können uns unterstützen, indem Sie eines unserer kostenpflichtigen Produkte kaufen.
Wir freuen uns sehr, dass Sie uns eine Postkarte aus Ihrer Heimatstadt schicken und erwähnen, welches unserer Pakete Sie verwenden. Unsere Adresse finden Sie auf unserer Kontaktseite. Wir veröffentlichen alle erhaltenen Postkarten auf unserer virtuellen Postkartenwand.
Verwenden Sie für Laravel 6.x oder PHP 7.x Version 3.x dieses Pakets.
Dieses Paket kann über Composer installiert werden.
composer require spatie/eloquent-sortable
In Laravel 5.5 und höher wird der Dienstanbieter automatisch registriert. In älteren Versionen des Frameworks fügen Sie einfach den Dienstanbieter in der Datei config/app.php
hinzu:
' providers ' => [
...
Spatie EloquentSortable EloquentSortableServiceProvider::class,
];
Optional können Sie die Konfigurationsdatei veröffentlichen mit:
php artisan vendor:publish --tag=eloquent-sortable-config
Dies ist der Inhalt der Datei, die in config/eloquent-sortable.php
veröffentlicht wird
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 ,
];
Um Ihrem Modell sortierbares Verhalten hinzuzufügen, müssen Sie:
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 ,
];
// ...
}
Wenn Sie keinen Wert $sortable['order_column_name']
festlegen, geht das Paket davon aus, dass der Name Ihrer Bestellspalte order_column
heißt.
Wenn Sie keinen Wert $sortable['sort_when_creating']
festlegen, weist das Paket einem neuen Modell automatisch die höchste Ordnungsnummer zu;
Angenommen, die Datenbanktabelle für MyModel
ist leer:
$ 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 ();
Mit der setNewOrder
-Methode können Sie eine neue Reihenfolge für alle Datensätze festlegen
/**
* 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 ]);
Optional können Sie als zweites Argument die Startreihenfolgenummer übergeben.
/**
* 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 );
Sie können die auszuführende Abfrage ändern, indem Sie als viertes Argument einen Abschluss übergeben.
/**
* 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 );
});
Um nach einer anderen Spalte als dem Primärschlüssel zu sortieren, verwenden Sie die setNewOrderByCustomColumn
-Methode.
/**
* 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 '
]);
Wie setNewOrder
akzeptiert auch setNewOrderByCustomColumn
ein optionales Startreihenfolge-Argument.
/**
* 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 );
Sie können ein Modell auch mit den folgenden Methoden nach oben oder unten verschieben:
$ myModel -> moveOrderDown ();
$ myModel -> moveOrderUp ();
Sie können ein Modell auch an die erste oder letzte Position verschieben:
$ myModel -> moveToStart ();
$ myModel -> moveToEnd ();
Sie können bestimmen, ob ein Element in der Reihenfolge an erster oder letzter Stelle steht:
$ myModel -> isFirstInOrder ();
$ myModel -> isLastInOrder ();
Sie können die Reihenfolge zweier Modelle vertauschen:
MyModel:: swapOrder ( $ myModel , $ anotherModel );
Wenn Ihr Modell/Ihre Tabelle über ein Gruppierungsfeld (normalerweise einen Fremdschlüssel) verfügt: id,
user_id
, title, order_column
und Sie möchten, dass die oben genannten Methoden dies berücksichtigen, können Sie in Ihrem Modell eine buildSortQuery
-Methode erstellen:
// MyModel.php
public function buildSortQuery ()
{
return static :: query ()-> where ( ' user_id ' , $ this -> user_id );
}
Dadurch werden die Berechnungen auf den Feldwert der Modellinstanz beschränkt.
Sobald eine Sortierung abgeschlossen ist, wird ein Ereignis ( SpatieEloquentSortableEloquentModelSortedEvent
) ausgelöst, auf das Sie warten können. Dies kann nützlich sein, um die Nachsortierungslogik auszuführen, z. B. das Löschen von Caches oder andere Aktionen, die nach einer Sortierung ausgeführt werden müssen.
Das Ereignis verfügt über einen isFor
-Helfer, mit dem Sie die sortierte Eloquent-Klasse bequem überprüfen können.
Nachfolgend finden Sie ein Beispiel dafür, wie Sie diese Veranstaltung anhören können:
use Spatie EloquentSortable EloquentModelSortedEvent as SortEvent ;
class SortingListener
{
public function handle ( SortEvent $ event ): void {
if ( $ event -> isFor (MyClass::class)) {
// ToDo: flush our cache
}
}
}
Das Paket enthält einige Integrations-/Smoke-Tests, die mit Orchestra eingerichtet wurden. Die Tests können über phpunit ausgeführt werden.
vendor/bin/phpunit
Weitere Informationen zu den letzten Änderungen finden Sie im CHANGELOG.
Weitere Informationen finden Sie unter BEITRAGEN.
Bitte lesen Sie unsere Sicherheitsrichtlinie zum Melden von Sicherheitslücken.
Die MIT-Lizenz (MIT). Weitere Informationen finden Sie in der Lizenzdatei.