Order Records

This functionality allows you to order model records between them.

Usage

Your models should use the Varbox\Traits\IsOrderable trait and the Varbox\Options\OrderOptions class.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Varbox\Options\OrderOptions;
use Varbox\Traits\IsOrderable;

class YourModel extends Model
{
    use IsOrderable;

    /**
     * Get the options for ordering the model.
     *
     * @return OrderOptions
     */
    public function getOrderOptions(): OrderOptions
    {
        return OrderOptions::instance();
    }
}

Next you should create an ord table column for your model table.
This column will be responsible for storing the model record's order number.

Schema::table('your_table', function (Blueprint $table) {
    $table->unsignedInteger('ord')->default(0);
});

Order Records

An easy method to order all you records is to use the setNewOrder() method.

This method accepts an array of model ids and will set the order incrementally starting from the first array value to the last. In other words, the order will be established based on the array you pass.

$items = YourModel::latest()->get();
$array = $items->pluck('id')->toArray();

YourModel::setNewOrder(array_values($array));

Fetch Records In Order

You can fetch model records in the order you established by using the ordered query scope.

$items = YourModel::ordered()->get();

Move Up

You can swap the order of your model with model above it by using the moveOrderUp() method.

$model = YourModel::find($id);

$model->moveOrderUp();

Move Down

You can swap the order of your model with model below it by using the moveOrderDown() method.

$model = YourModel::find($id);

$model->moveOrderDown();

Move To Start

You can set a certain model to be at the first position by using the moveToStart() method.

$model = YourModel::find($id);

$model->moveToStart();

Move To End

You can set a certain model to be at the last position by using the moveToEnd() method.

$model = YourModel::find($id);

$model->moveToEnd();

Swap Order

You can swap the order of two models by using the swapOrder() method.

$model1 = YourModel::find($id);
$model2 = YourModel::find($id);

$model2->swapOrderWithModel($model1);

// or the static call version

YourModel::swapOrder($model2, $model1);

Customizations

The order functionality offers a variety of customizations to fit your needs.

Change Order Column

By default, the ordering functionality works based on a ord table column.

You can change the name of that column by using the setOrderColumn() method in your definition of the getOrderOptions() method.

/**
 * Set the options for the IsOrderable trait.
 *
 * @return OrderOptions
 */
public function getOrderOptions(): OrderOptions
{
    return OrderOptions::instance()
        ->setOrderColumn('position');
}

Disable Order When Creating

By default, when creating a new model record, the ord value for it will be the highest, thus making it last in order.

You can disable this behavior by using the doNotOrderWhenCreating() method in your definition of the getOrderOptions() method.

Please note that by doing so the value of the ord column will be the default one.

/**
 * Set the options for the IsOrderable trait.
 *
 * @return OrderOptions
 */
public function getOrderOptions(): OrderOptions
{
    return OrderOptions::instance()
        ->doNotOrderWhenCreating();
}

Implementation Example

For an implementation example of this functionality please refer to the Full Example page.