پرش به مطلب اصلی

پیاده‌سازی مدل‌های قابل مرتب‌سازی

مقدمه

این راهنما نحوه پیاده‌سازی مدل‌های قابل مرتب‌سازی در برنامه Laravel شما را توضیح می‌دهد، که به شما امکان می‌دهد به راحتی ترتیب رکوردها را در پایگاه داده خود مدیریت کنید. قابلیت مرتب‌سازی بر روی یک زیرساخت قوی ساخته شده است که به طور خودکار موقعیت رکوردها را مدیریت می‌کند.

مزیت کلیدی

پیاده‌سازی رابط قابل مرتب‌سازی به مدل‌های شما اجازه می‌دهد به طور خودکار مرتب شوند، که ایجاد رابط‌های کشیدن و رها کردن و حفظ مرتب‌سازی یکنواخت در سراسر برنامه شما را آسان می‌کند.

مراحل پیاده‌سازی

مرحله 1: پیاده‌سازی رابط و Trait

ابتدا، رابط SortableEntity را پیاده‌سازی کنید و trait HasSorting را به مدل خود اضافه کنید:

app/Models/YourModel.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Services\SortOrder\Contracts\SortableEntity;
use App\Services\SortOrder\Traits\HasSorting;

class YourModel extends Model implements SortableEntity
{
use HasSorting;

// ویژگی‌ها و متدهای مدل شما...
}

مرحله 2: پیکربندی ستون مرتب‌سازی (اختیاری)

اگر نام ستون مرتب‌سازی شما با پیش‌فرض order متفاوت است، متد sortingColumnName را بازنویسی کنید:

// اگر از 'order' به عنوان ستون مرتب‌سازی استفاده می‌کنید، نیازی به بازنویسی نیست
// پیاده‌سازی پیش‌فرض به این صورت است:

public function sortingColumnName(): string
{
return 'order';
}

با پیکربندی پیش‌فرض، سیستم از ستون order برای مرتب‌سازی استفاده خواهد کرد.

طرح پایگاه داده

مطمئن شوید که جدول شما ستون مناسب (یا order یا نام ستون سفارشی شما) را به عنوان یک عدد صحیح در مهاجرت خود تعریف کرده است:

$table->integer('order')->default(0);

مرحله 3: تعریف محدوده مرتب‌سازی (اختیاری)

اگر نیاز دارید مرتب‌سازی را به گروه‌های خاصی از رکوردها محدود کنید (مثلاً، فقط آیتم‌ها را در همان دسته مرتب کنید)، متد baseSortQuery را بازنویسی کنید:

// اگر همه رکوردها را با هم مرتب می‌کنید، نیازی به بازنویسی نیست
// پیاده‌سازی پیش‌فرض به این صورت است:

public function baseSortQuery(): Builder
{
return $this->newQuery();
}

این همه رکوردهای مدل را با هم مرتب خواهد کرد.

ویژگی‌های موجود

پس از پیاده‌سازی رابط و trait قابل مرتب‌سازی، مدل شما قابلیت‌های زیر را خواهد داشت:

1. مرتب‌سازی خودکار رکوردهای جدید

رکوردهای جدید به طور خودکار موقعیت بعدی موجود در محدوده مرتب‌سازی خود را دریافت می‌کنند.

ایجاد یک رکورد جدید
// رکورد جدید در انتهای لیست قرار خواهد گرفت
$item = YourModel::create([
'name' => 'آیتم جدید',
'category_id' => 1
]);

// نیازی به تنظیم دستی ترتیب نیست - به طور خودکار مدیریت می‌شود

2. تغییر ترتیب آیتم‌ها

می‌توانید به راحتی موقعیت آیتم‌ها را تغییر دهید:

تغییر ترتیب آیتم‌ها
// حرکت یک آیتم یک موقعیت به بالا
$item->moveUp();

// حرکت یک آیتم یک موقعیت به پایین
$item->moveDown();

// حرکت یک آیتم به موقعیت خاص
$item->moveTo(3);

// حرکت یک آیتم به اولین موقعیت
$item->moveToStart();

// حرکت یک آیتم به آخرین موقعیت
$item->moveToEnd();

3. مرتب‌سازی مجدد خودکار پس از حذف

وقتی یک رکورد حذف می‌شود، سیستم به طور خودکار آیتم‌های باقیمانده را برای حفظ موقعیت‌های متوالی مرتب می‌کند.

حذف یک رکورد
// وقتی این آیتم حذف می‌شود، سایر آیتم‌ها به طور خودکار مرتب می‌شوند
$item->delete();

4. پرس‌وجوهای مبتنی بر ترتیب

مدل‌های خود را به ترتیب مرتب‌شده پرس‌وجو کنید:

پرس‌وجو به ترتیب مرتب‌شده
// دریافت همه آیتم‌ها به ترتیب مرتب‌شده
$items = YourModel::ordered()->get();

// ترکیب با سایر شرایط پرس‌وجو
$items = YourModel::where('is_active', true)
->ordered()
->get();

زیرساخت

سیستم مرتب‌سازی از یک الگوی observer استفاده می‌کند که به طور خودکار روی مدل‌هایی که رابط SortableEntity را پیاده‌سازی می‌کنند اعمال می‌شود. این observer موارد زیر را مدیریت می‌کند:

  • تنظیم مقدار اولیه ترتیب برای رکوردهای جدید
  • مرتب‌سازی مجدد رکوردها هنگامی که موقعیت یک آیتم تغییر می‌کند
  • پاکسازی توالی ترتیب هنگامی که رکوردها حذف می‌شوند

نیازی به پیکربندی دستی observer نیست - به طور خودکار از طریق سیستم ارائه‌دهنده سرویس Laravel ثبت می‌شود.

مثال پیاده‌سازی

app/Models/MenuItem.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Services\SortOrder\Contracts\SortableEntity;
use App\Services\SortOrder\Traits\HasSorting;

class MenuItem extends Model implements SortableEntity
{
use HasSorting;

protected $fillable = [
'name',
'url',
'menu_id',
'is_active'
];

// بازنویسی برای مرتب‌سازی در همان منو
public function baseSortQuery(): Builder
{
return $this->newQuery()
->where('menu_id', $this->menu_id);
}

// رابطه با منو
public function menu()
{
return $this->belongsTo(Menu::class);
}
}

نتیجه‌گیری

پیاده‌سازی مدل‌های قابل مرتب‌سازی با استفاده از رابط SortableEntity و trait HasSorting یک پایه قوی برای مدیریت رکوردهای مرتب‌شده در برنامه Laravel شما فراهم می‌کند. این رویکرد ایجاد لیست‌های قابل مرتب‌سازی، رابط‌های کشیدن و رها کردن، و هر ویژگی که نیاز به حفظ ترتیب خاصی از رکوردها دارد را ساده می‌کند.

با استفاده از قابلیت‌های مرتب‌سازی خودکار، می‌توانید بر روی ساخت ویژگی‌های منحصر به فرد برنامه خود تمرکز کنید، به جای نگرانی درباره پیچیدگی‌های حفظ ترتیب رکوردها.