このパッケージは、Eloquent モデルに並べ替え可能な動作を追加する特性を提供します。
モデルの新しいレコードの順序列の値は、そのモデルのすべてのレコードの順序列の最大値 + 1 によって決まります。
このパッケージは、すべてのレコードを正しい順序でフェッチするためのクエリ スコープも提供します。
Spatie は、ベルギーのアントワープにあるウェブデザイン会社です。当社のすべてのオープンソース プロジェクトの概要は、当社の Web サイトでご覧いただけます。
このようなパッケージの作成方法については、プレミアム ビデオ コースをご覧ください。
私たちはクラス最高のオープンソース パッケージの作成に多くのリソースを投資しています。有料製品のいずれかを購入することで、私たちをサポートできます。
当社のどのパッケージを使用しているかについて、故郷から葉書を送っていただき、誠にありがとうございます。当社の住所は、お問い合わせページに記載されています。受け取ったすべてのポストカードをバーチャル ポストカード ウォールに公開します。
Laravel 6.x または PHP 7.x の場合は、このパッケージのバージョン 3.x を使用します。
このパッケージは Composer を通じてインストールできます。
composer require spatie/eloquent-sortable
Laravel 5.5 以降では、サービスプロバイダーが自動的に登録されます。フレームワークの古いバージョンでは、 config/app.php
ファイルにサービス プロバイダーを追加するだけです。
' providers ' => [
...
Spatie EloquentSortable EloquentSortableServiceProvider::class,
];
必要に応じて、次のコマンドを使用して構成ファイルを公開できます。
php artisan vendor:publish --tag=eloquent-sortable-config
これは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 ,
];
モデルに並べ替え可能な動作を追加するには、次のことを行う必要があります。
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 ,
];
// ...
}
値$sortable['order_column_name']
を設定しない場合、パッケージは注文列名がorder_column
であると想定します。
値$sortable['sort_when_creating']
を設定しない場合、パッケージは自動的に最高の順序番号を新しいモデルに割り当てます。
MyModel
の db-table が空であると仮定します。
$ 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 ();
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 ]);
オプションで、開始順序番号を 2 番目の引数として渡すことができます。
/**
* 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 );
4 番目の引数としてクロージャーを渡すことで、実行されるクエリを変更できます。
/**
* 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 );
});
主キー以外の列を使用して並べ替えるには、 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 '
]);
setNewOrder
と同様に、 setNewOrderByCustomColumn
もオプションの開始順序引数を受け入れます。
/**
* 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 );
次の方法を使用してモデルを上下に移動することもできます。
$ myModel -> moveOrderDown ();
$ myModel -> moveOrderUp ();
モデルを最初または最後の位置に移動することもできます。
$ myModel -> moveToStart ();
$ myModel -> moveToEnd ();
要素が順番の最初か最後かを判断できます。
$ myModel -> isFirstInOrder ();
$ myModel -> isLastInOrder ();
2 つのモデルの順序を入れ替えることができます。
MyModel:: swapOrder ( $ myModel , $ anotherModel );
モデル/テーブルにグループ化フィールド (通常は外部キー): id,
user_id
, title, order_column
があり、上記のメソッドでそれを考慮したい場合は、モデルでbuildSortQuery
メソッドを作成できます。
// MyModel.php
public function buildSortQuery ()
{
return static :: query ()-> where ( ' user_id ' , $ this -> user_id );
}
これにより、計算がモデル インスタンスのフィールド値に制限されます。
並べ替えが完了すると、リッスンできるイベント ( SpatieEloquentSortableEloquentModelSortedEvent
) が送出されます。これは、キャッシュのクリアや並べ替え後に実行する必要があるその他のアクションなど、並べ替え後のロジックを実行する場合に役立ちます。
このイベントには、ソートされた Eloquent クラスを簡単に確認できるisFor
ヘルパーがあります。
以下は、このイベントをリッスンする方法の例です。
use Spatie EloquentSortable EloquentModelSortedEvent as SortEvent ;
class SortingListener
{
public function handle ( SortEvent $ event ): void {
if ( $ event -> isFor (MyClass::class)) {
// ToDo: flush our cache
}
}
}
パッケージには、Orchestrator で設定されたいくつかの統合/スモーク テストが含まれています。テストはphpunit経由で実行できます。
vendor/bin/phpunit
最近の変更点の詳細については、CHANGELOG を参照してください。
詳細については、「貢献」を参照してください。
セキュリティの脆弱性を報告する方法については、セキュリティ ポリシーをご覧ください。
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。