021-88881776

آموزش رابطه‌ها (Relations) در Filament

آموزش Filament یکی از موضوعات مهم در توسعه وب و مدیریت داده‌ها است که به کمک آن می‌توان ارتباطات پیچیده بین مدل‌ها را به‌راحتی مدیریت کرد. در این مقاله، به بررسی جامع و کامل رابطه‌ها (Relations) در Filament خواهیم پرداخت و تمامی جنبه‌های این موضوع را از سطح مبتدی تا پیشرفته پوشش می‌دهیم.

Relation Managers در Filament

Relation Managers در رابطه‌ها (Relations) در Filament یکی از ابزارهای قدرتمند این فریم‌ورک هستند که به توسعه‌دهندگان امکان می‌دهند تا به‌صورت ساده و کارآمد روابط بین مدل‌های مختلف را مدیریت کنند. این ابزارها به ویژه زمانی که با روابط پیچیده و چندگانه‌ای روبرو هستید، بسیار مفید هستند. با استفاده از Relation Managers در Filament می‌توانید به راحتی عملیات CRUD (ایجاد، خواندن، به‌روزرسانی، حذف) را برای هر نوع رابطه‌ای که بین مدل‌ها وجود دارد، پیاده‌سازی کنید.

Relation Managers به شما اجازه می‌دهند تا بخش‌های مرتبط با روابط را به صورت جداگانه در منابع (Resources) تعریف کنید. این امر باعث می‌شود که کدهای شما سازمان‌یافته‌تر و قابل مدیریت‌تر باشند. علاوه بر این، Relation Managers امکان سفارشی‌سازی فرم‌ها و جداول مرتبط با هر رابطه را فراهم می‌کنند، که به شما اجازه می‌دهد تا تجربه کاربری بهتری ارائه دهید و نیازهای خاص پروژه خود را برآورده کنید.

شرح مزایا و کاربردهای Relation Managers

استفاده از Relation Managers در Filament مزایای متعددی دارد که به شرح زیر می‌باشد:

ساده‌سازی کد: یکی از بزرگ‌ترین مزایای استفاده از Relation Managers، کاهش پیچیدگی کدهای مربوط به مدیریت روابط است. با تفکیک مدیریت هر رابطه به یک کلاس مجزا، کدها تمیزتر و قابل فهم‌تر می‌شوند.

افزایش سرعت توسعه: با استفاده از Relation Managers در Filament، توسعه‌دهندگان می‌توانند به سرعت ویژگی‌های مرتبط با روابط را پیاده‌سازی کنند. این ابزارها الگوهای از پیش تعریف شده‌ای را ارائه می‌دهند که زمان توسعه را به‌طور قابل توجهی کاهش می‌دهند.

قابلیت تنظیم بالا: Relation Managers انعطاف‌پذیری بالایی در تنظیم و سفارشی‌سازی روابط بر اساس نیازهای پروژه دارند. شما می‌توانید فرم‌ها و جداول مرتبط را به دلخواه خود تنظیم کنید و ویژگی‌های خاصی را به آن‌ها اضافه کنید.

مدیریت بهتر روابط پیچیده: در پروژه‌های بزرگ که شامل روابط پیچیده و چندگانه‌ای هستند، Relation Managers به شما کمک می‌کنند تا به‌سادگی این روابط را مدیریت کنید بدون اینکه کدهای اضافی و پیچیده‌ای بنویسید.

بهبود نگهداری و مقیاس‌پذیری: با داشتن کدهای منظم و سازمان‌یافته، نگهداری و مقیاس‌پذیری پروژه‌های شما آسان‌تر می‌شود. هر تغییر در یک رابطه خاص می‌تواند به‌راحتی در Relation Manager مربوطه اعمال شود.

مثال عملی از استفاده Relation Managers با کد نمونه

برای درک بهتر Relation Managers در Filament، در ادامه یک مثال عملی با کد نمونه آورده شده است. فرض کنید شما یک مدل User دارید که با مدل Post رابطه hasMany دارد. می‌خواهیم با استفاده از Relation Managers این رابطه را مدیریت کنیم.

ابتدا، یک کلاس Relation Manager برای مدیریت پست‌های کاربران ایجاد می‌کنیم:

<?php

namespace App\Filament\Resources\UserResource\RelationManagers;

use Filament\Forms;
use Filament\Resources\Form;
use Filament\Resources\RelationManagers\HasManyRelationManager;
use Filament\Resources\Table;
use Filament\Tables;

class PostsRelationManager extends HasManyRelationManager
{
    protected static string $relationship = 'posts';

    protected static ?string $recordTitleAttribute = 'title';

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('title')
                    ->required()
                    ->maxLength(255),
                Forms\Components\Textarea::make('content')
                    ->required(),
            ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('title')
                    ->sortable()
                    ->searchable(),
                Tables\Columns\TextColumn::make('created_at')
                    ->dateTime('d M Y')
                    ->sortable(),
            ])
            ->filters([
                Tables\Filters\Filter::make('recent')
                    ->label('Recent Posts')
                    ->query(fn ($query) => $query->where('created_at', '>=', now()->subMonth())),
            ])
            ->headerActions([
                Tables\Actions\CreateAction::make(),
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
                Tables\Actions\DeleteAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\DeleteBulkAction::make(),
            ]);
    }
}

سپس، در کلاس UserResource، این Relation Manager را به روابط مربوطه اضافه می‌کنیم:

<?php

namespace App\Filament\Resources;

use App\Filament\Resources\UserResource\RelationManagers\PostsRelationManager;
use App\Models\User;
use Filament\Forms;
use Filament\Resources\Resource;
use Filament\Resources\Pages\ListRecords;
use Filament\Resources\Pages\EditRecord;
use Filament\Tables;

class UserResource extends Resource
{
    protected static ?string $model = User::class;

    protected static ?string $navigationIcon = 'heroicon-o-user';

    public static function form(Forms\Form $form): Forms\Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('name')
                    ->required()
                    ->maxLength(255),
                Forms\Components\TextInput::make('email')
                    ->email()
                    ->required()
                    ->unique(ignoreRecord: true),
                // سایر فیلدها
            ]);
    }

    public static function table(Tables\Table $table): Tables\Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('name')
                    ->sortable()
                    ->searchable(),
                Tables\Columns\TextColumn::make('email')
                    ->sortable()
                    ->searchable(),
                Tables\Columns\TextColumn::make('created_at')
                    ->dateTime('d M Y')
                    ->sortable(),
            ])
            ->filters([
                Tables\Filters\Filter::make('recent')
                    ->label('Recent Users')
                    ->query(fn ($query) => $query->where('created_at', '>=', now()->subMonth())),
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
                Tables\Actions\DeleteAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\DeleteBulkAction::make(),
            ]);
    }

    public static function getRelations(): array
    {
        return [
            PostsRelationManager::class,
        ];
    }

    public static function getPages(): array
    {
        return [
            'index' => ListRecords::route('/'),
            'edit' => EditRecord::route('/{record}/edit'),
        ];
    }
}

در این مثال:

PostsRelationManager به عنوان یک Relation Manager برای مدیریت پست‌های هر کاربر تعریف شده است.
در UserResource، این Relation Manager به بخش روابط اضافه شده است تا بتوانید پست‌های هر کاربر را مستقیماً از صفحه مدیریت کاربران مدیریت کنید.
فرم و جدول مرتبط با پست‌ها به‌صورت سفارشی تعریف شده‌اند تا نیازهای خاص پروژه را برآورده کنند.

مدیریت hasMany در Filament

یکی از رایج‌ترین رابطه‌ها (Relations) در Filament، رابطه hasMany است که نشان‌دهنده یک رابطه یک به چند بین دو مدل می‌باشد. در این بخش، نحوه مدیریت روابط hasMany در Filament را به تفصیل بررسی می‌کنیم. این توضیحات شامل تعریف رابطه در مدل‌ها، پیاده‌سازی عملی با کد نمونه، نکات پیشرفته و بهترین روش‌ها خواهد بود تا شما بتوانید به طور کامل از این نوع رابطه در پروژه‌های خود بهره‌مند شوید.

رابطه hasMany زمانی استفاده می‌شود که یک رکورد از مدل اصلی می‌تواند به چندین رکورد از مدل مرتبط مرتبط باشد. به عبارت دیگر، این رابطه بیان می‌کند که یک شیء از مدل اصلی (مثلاً یک کاربر) می‌تواند چندین شیء از مدل مرتبط (مثلاً پست‌ها) داشته باشد. این نوع رابطه به ویژه در سیستم‌های مدیریت محتوا، فروشگاه‌های آنلاین و هر جایی که نیاز به نمایش و مدیریت داده‌های مرتبط متعدد است، بسیار مفید است.

مزایای استفاده از رابطه hasMany در Filament

مدیریت آسان داده‌های مرتبط: با استفاده از رابطه hasMany، می‌توانید به سادگی داده‌های مرتبط را اضافه، حذف و ویرایش کنید بدون نیاز به نوشتن کدهای پیچیده.
نمایش ساختارمند داده‌ها: داده‌های مرتبط به صورت جدول یا فرم نمایش داده می‌شوند که خوانایی و مدیریت آن‌ها را آسان‌تر می‌کند.
یکپارچگی داده‌ها: اطمینان حاصل می‌شود که داده‌های مرتبط به درستی مدیریت می‌شوند و از بروز خطاهای احتمالی جلوگیری می‌شود.

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

برای درک بهتر نحوه مدیریت رابطه hasMany در Filament، بیایید یک مثال عملی را بررسی کنیم. فرض کنید شما دو مدل User و Post دارید که هر کاربر می‌تواند چندین پست داشته باشد. مراحل زیر را برای مدیریت این رابطه در Filament دنبال کنید:

۱. تعریف رابطه در مدل‌ها

ابتدا باید روابط بین مدل‌ها را در فایل‌های مدل تعریف کنید.

// در مدل User
public function posts()
{
    return $this->hasMany(Post::class);
}

// در مدل Post
public function user()
{
    return $this->belongsTo(User::class);
}

۲. ایجاد Relation Manager

سپس باید یک Relation Manager برای مدیریت رابطه hasMany ایجاد کنید. این کار معمولاً در کلاس UserResource انجام می‌شود.

// در کلاس UserResource
public static function relationManagers(): array
{
    return [
        PostsRelationManager::class,
    ];
}

۳. تعریف PostsRelationManager

حال باید کلاس PostsRelationManager را تعریف کنید که وظیفه مدیریت پست‌های مربوط به هر کاربر را بر عهده دارد.

use Filament\Resources\RelationManagers\HasManyRelationManager;
use Filament\Forms;
use Filament\Tables;

class PostsRelationManager extends HasManyRelationManager
{
    protected static string $relationship = 'posts';

    public static function form(Forms\Form $form): Forms\Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('title')
                    ->required()
                    ->maxLength(255),
                Forms\Components\Textarea::make('content')
                    ->required(),
            ]);
    }

    public static function table(Tables\Table $table): Tables\Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('title')
                    ->sortable()
                    ->searchable(),
                Tables\Columns\TextColumn::make('created_at')
                    ->dateTime()
                    ->sortable(),
            ])
            ->filters([
                // اضافه کردن فیلترهای مورد نیاز
            ])
            ->headerActions([
                Tables\Actions\CreateAction::make(),
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
                Tables\Actions\DeleteAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\DeleteBulkAction::make(),
            ]);
    }
}

توضیح کد نمونه

تعریف رابطه: با تنظیم protected static string $relationship = ‘posts’; به Filament اطلاع می‌دهید که این Relation Manager مربوط به رابطه posts است.
تعریف فرم: در متد form، فیلدهای لازم برای ایجاد و ویرایش پست‌ها تعریف شده‌اند. در اینجا فیلدهای title و content مورد استفاده قرار گرفته‌اند.
تعریف جدول: در متد table، ستون‌های مورد نیاز برای نمایش پست‌ها در جدول مشخص شده‌اند. همچنین، اقدامات مانند ایجاد، ویرایش و حذف برای هر ردیف اضافه شده‌اند.
فیلترها و اقدامات جمعی: شما می‌توانید فیلترهای مختلفی را برای جستجو و مرتب‌سازی داده‌ها اضافه کنید و همچنین اقدامات جمعی مانند حذف چندگانه را فعال کنید.

اجرای Migration برای ایجاد جدول‌های مرتبط

برای اطمینان از اینکه جداول پایگاه داده به درستی ایجاد شده‌اند، باید Migrationهای لازم را اجرا کنید.

php artisan make:migration create_posts_table --create=posts

سپس در فایل Migration ایجاد شده، ساختار جدول posts را تعریف کنید:

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained()->onDelete('cascade');
        $table->string('title');
        $table->text('content');
        $table->timestamps();
    });
}

پس از تعریف Migration، آن را اجرا کنید:

php artisan migrate

با انجام مراحل بالا، شما یک رابطه hasMany بین مدل‌های User و Post در Filament ایجاد کرده‌اید. اکنون در پنل مدیریت Filament، می‌توانید به راحتی پست‌های مربوط به هر کاربر را مشاهده، ایجاد و ویرایش کنید.

نکات پیشرفته

برای استفاده بهتر و بهینه‌تر از رابطه hasMany در Filament، می‌توانید از نکات پیشرفته زیر بهره ببرید:

۱. استفاده از فیلترها و مرتب‌سازی‌ها

با افزودن فیلترها و گزینه‌های مرتب‌سازی به جدول، کاربران می‌توانند داده‌ها را به راحتی مدیریت کنند. به عنوان مثال، می‌توانید امکان فیلتر کردن پست‌ها بر اساس تاریخ ایجاد یا عنوان را اضافه کنید.

->filters([
    Tables\Filters\Filter::make('created_at')
        ->form([
            Forms\Components\DatePicker::make('created_from'),
            Forms\Components\DatePicker::make('created_until'),
        ])
        ->query(function (Builder $query, array $data) {
            return $query
                ->when($data['created_from'], fn($q) => $q->whereDate('created_at', '>=', $data['created_from']))
                ->when($data['created_until'], fn($q) => $q->whereDate('created_at', '<=', $data['created_until']));
        }),
])

۲. اعتبارسنجی داده‌ها

برای اطمینان از صحت داده‌های وارد شده، می‌توانید قوانین اعتبارسنجی را در فرم‌های Relation Manager تعریف کنید.

Forms\Components\TextInput::make('title')
    ->required()
    ->maxLength(255)
    ->rules(['min:3', 'max:255']),
Forms\Components\Textarea::make('content')
    ->required()
    ->rules(['min:10']),

۳. سفارشی‌سازی رابط کاربری

با استفاده از امکانات Filament، می‌توانید رابط کاربری Relation Manager را بر اساس نیازهای خود سفارشی‌سازی کنید. به عنوان مثال، می‌توانید از کامپوننت‌های مختلف Filament مانند Select، Toggle و غیره استفاده کنید تا فرم‌های کاربرپسندتری ایجاد کنید.

۴. استفاده از Eager Loading برای بهبود عملکرد

برای بهبود عملکرد برنامه و کاهش تعداد درخواست‌های به پایگاه داده، می‌توانید از Eager Loading استفاده کنید. این کار با بارگذاری پیش‌فرض روابط مرتبط انجام می‌شود.

public static function getEloquentQuery(): Builder
{
    return parent::getEloquentQuery()->with(['posts']);
}

۵. مدیریت دسترسی‌ها

با استفاده از قابلیت‌های Filament، می‌توانید دسترسی‌های مختلف را برای Relation Managerها تنظیم کنید تا تنها کاربران مجاز بتوانند داده‌ها را مشاهده یا ویرایش کنند.

public static function canCreate(): bool
{
    return auth()->user()->hasRole('admin');
}

public static function canEdit(): bool
{
    return auth()->user()->hasRole('editor');
}

public static function canDelete(): bool
{
    return auth()->user()->hasRole('admin');
}

۶. افزودن عملیات سفارشی

می‌توانید عملیات سفارشی مانند تایید پست‌ها، انتشار آن‌ها و غیره را به Relation Manager اضافه کنید.

Tables\Actions\Action::make('approve')
    ->label('Approve')
    ->action(function (Post $record) {
        $record->update(['approved' => true]);
    })
    ->requiresConfirmation()
    ->color('success'),

مدیریت belongsToMany در Filament

یکی از رابطه‌ها (Relations) در Filament، رابطه belongsToMany است که برای مدیریت روابط چند به چند بین مدل‌ها استفاده می‌شود. این نوع رابطه زمانی کاربرد دارد که یک رکورد از مدل اصلی می‌تواند به چندین رکورد از مدل مرتبط و بالعکس مرتبط باشد. در این بخش، نحوه مدیریت روابط belongsToMany در Filament را به تفصیل بررسی می‌کنیم. این توضیحات شامل تعریف رابطه در مدل‌ها، پیاده‌سازی عملی با کد نمونه، نکات پیشرفته و بهترین روش‌ها خواهد بود تا شما بتوانید به طور کامل از این نوع رابطه در پروژه‌های خود بهره‌مند شوید.

رابطه belongsToMany زمانی استفاده می‌شود که نیاز به ارتباط چند به چند بین دو مدل دارید. به عنوان مثال، یک پست (Post) می‌تواند به چندین برچسب (Tag) مرتبط باشد و یک برچسب نیز می‌تواند به چندین پست مرتبط باشد. این نوع رابطه به شما امکان می‌دهد تا داده‌های پیچیده‌تری را مدیریت کنید که نیاز به ارتباطات چند به چند دارند.

مزایای استفاده از رابطه belongsToMany در Filament

مدیریت روابط پیچیده: با استفاده از رابطه belongsToMany، می‌توانید به سادگی روابط چند به چند را بین مدل‌ها مدیریت کنید بدون نیاز به نوشتن کدهای پیچیده.
افزایش انعطاف‌پذیری: این نوع رابطه به شما اجازه می‌دهد تا به راحتی روابط جدید را اضافه یا حذف کنید بدون نیاز به تغییرات گسترده در کد.
نمایش داده‌های مرتبط به صورت کاربرپسند: با استفاده از فرم‌های انتخاب چندگانه، کاربران می‌توانند به راحتی داده‌های مرتبط را مدیریت کنند.
یکپارچگی داده‌ها: اطمینان حاصل می‌شود که داده‌های مرتبط به درستی مدیریت می‌شوند و از بروز خطاهای احتمالی جلوگیری می‌شود.

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

برای درک بهتر نحوه مدیریت رابطه belongsToMany در Filament، بیایید یک مثال عملی را بررسی کنیم. فرض کنید شما دو مدل Post و Tag دارید که رابطه چند به چند بین آنها وجود دارد. مراحل زیر را برای مدیریت این رابطه در Filament دنبال کنید:

۱. تعریف رابطه در مدل‌ها

ابتدا باید روابط بین مدل‌ها را در فایل‌های مدل تعریف کنید.

// در مدل Post
public function tags()
{
    return $this->belongsToMany(Tag::class);
}

// در مدل Tag
public function posts()
{
    return $this->belongsToMany(Post::class);
}

۲. ایجاد Relation Manager

سپس باید یک Relation Manager برای مدیریت رابطه belongsToMany ایجاد کنید. این کار معمولاً در کلاس PostResource انجام می‌شود.

// در کلاس PostResource
public static function relationManagers(): array
{
    return [
        TagsRelationManager::class,
    ];
}

 

۳. تعریف TagsRelationManager

حال باید کلاس TagsRelationManager را تعریف کنید که وظیفه مدیریت برچسب‌های مربوط به هر پست را بر عهده دارد.

 

use Filament\Resources\RelationManagers\BelongsToManyRelationManager;
use Filament\Forms;
use Filament\Tables;

class TagsRelationManager extends BelongsToManyRelationManager
{
    protected static string $relationship = 'tags';

    public static function form(Forms\Form $form): Forms\Form
    {
        return $form
            ->schema([
                Forms\Components\Select::make('tags')
                    ->multiple()
                    ->relationship('tags', 'name')
                    ->preload()
                    ->required(),
            ]);
    }

    public static function table(Tables\Table $table): Tables\Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('name')
                    ->sortable()
                    ->searchable(),
            ])
            ->filters([
                // اضافه کردن فیلترهای مورد نیاز
            ])
            ->headerActions([
                Tables\Actions\AttachAction::make(),
                Tables\Actions\DetachAction::make(),
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
                Tables\Actions\DetachAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\DetachBulkAction::make(),
            ]);
    }
}

توضیح کد نمونه

تعریف رابطه: با تنظیم protected static string $relationship = ‘tags’; به Filament اطلاع می‌دهید که این Relation Manager مربوط به رابطه tags است.
تعریف فرم: در متد form، یک فیلد انتخاب چندگانه (Select) تعریف شده است که به کاربران اجازه می‌دهد چندین برچسب را به یک پست اختصاص دهند. ویژگی preload باعث می‌شود که برچسب‌ها از قبل بارگذاری شوند تا عملکرد بهتری داشته باشند.
تعریف جدول: در متد table, ستون‌های مورد نیاز برای نمایش برچسب‌ها در جدول مشخص شده‌اند. همچنین، اقدامات مانند الحاق (AttachAction), جدا کردن (DetachAction), و ویرایش (EditAction) برای هر ردیف اضافه شده‌اند.
فیلترها و اقدامات جمعی: شما می‌توانید فیلترهای مختلفی را برای جستجو و مرتب‌سازی داده‌ها اضافه کنید و همچنین اقدامات جمعی مانند جدا کردن چندگانه را فعال کنید.

اجرای Migration برای ایجاد جدول‌های مرتبط

برای اطمینان از اینکه جداول پایگاه داده به درستی ایجاد شده‌اند، باید Migrationهای لازم را اجرا کنید.

php artisan make:migration create_post_tag_table --create=post_tag

سپس در فایل Migration ایجاد شده، ساختار جدول post_tag را تعریف کنید:

public function up()
{
    Schema::create('post_tag', function (Blueprint $table) {
        $table->id();
        $table->foreignId('post_id')->constrained()->onDelete('cascade');
        $table->foreignId('tag_id')->constrained()->onDelete('cascade');
        $table->timestamps();
    });
}

پس از تعریف Migration، آن را اجرا کنید:

php artisan migrate

با انجام مراحل بالا، شما یک رابطه belongsToMany بین مدل‌های Post و Tag در Filament ایجاد کرده‌اید. اکنون در پنل مدیریت Filament، می‌توانید به راحتی برچسب‌های مربوط به هر پست را مشاهده، ایجاد، و ویرایش کنید.

نکات پیشرفته

برای استفاده بهتر و بهینه‌تر از رابطه belongsToMany در Filament، می‌توانید از نکات پیشرفته زیر بهره ببرید:

۱. استفاده از فیلترها و مرتب‌سازی‌ها

با افزودن فیلترها و گزینه‌های مرتب‌سازی به جدول، کاربران می‌توانند داده‌ها را به راحتی مدیریت کنند. به عنوان مثال، می‌توانید امکان فیلتر کردن برچسب‌ها بر اساس نام یا تعداد پست‌های مرتبط را اضافه کنید.

->filters([
    Tables\Filters\Filter::make('name')
        ->query(function (Builder $query, array $data) {
            return $query->where('name', 'like', '%' . $data['name'] . '%');
        })
        ->form([
            Forms\Components\TextInput::make('name')->placeholder('جستجو برچسب‌ها'),
        ]),
])

۲. مدیریت داده‌های میانی (Pivot Data)

اگر نیاز به ذخیره داده‌های اضافی در جدول میانی (مثل تاریخ الحاق) دارید، می‌توانید این داده‌ها را نیز مدیریت کنید.

public static function form(Forms\Form $form): Forms\Form
{
    return $form
        ->schema([
            Forms\Components\Select::make('tags')
                ->multiple()
                ->relationship('tags', 'name')
                ->preload()
                ->required(),
            Forms\Components\DatePicker::make('pivot_created_at')
                ->label('تاریخ الحاق')
                ->disabled(),
        ]);
}

۳. اعتبارسنجی داده‌ها

برای اطمینان از صحت داده‌های وارد شده، می‌توانید قوانین اعتبارسنجی را در فرم‌های Relation Manager تعریف کنید.

Forms\Components\Select::make('tags')
    ->multiple()
    ->relationship('tags', 'name')
    ->preload()
    ->required()
    ->rules(['required', 'array', 'min:1']),

۴. سفارشی‌سازی رابط کاربری

با استفاده از امکانات Filament، می‌توانید رابط کاربری Relation Manager را بر اساس نیازهای خود سفارشی‌سازی کنید. به عنوان مثال، می‌توانید از کامپوننت‌های مختلف Filament مانند Toggle, RichEditor, و غیره استفاده کنید تا فرم‌های کاربرپسندتری ایجاد کنید.

Forms\Components\Toggle::make('is_active')
    ->label('فعال')
    ->default(true),

۵. استفاده از Eager Loading برای بهبود عملکرد

برای بهبود عملکرد برنامه و کاهش تعداد درخواست‌های به پایگاه داده، می‌توانید از Eager Loading استفاده کنید. این کار با بارگذاری پیش‌فرض روابط مرتبط انجام می‌شود.

public static function getEloquentQuery(): Builder
{
    return parent::getEloquentQuery()->with(['tags']);
}

۶. مدیریت دسترسی‌ها

با استفاده از قابلیت‌های Filament، می‌توانید دسترسی‌های مختلف را برای Relation Managerها تنظیم کنید تا تنها کاربران مجاز بتوانند داده‌ها را مشاهده یا ویرایش کنند.

public static function canAttach(): bool
{
    return auth()->user()->hasRole('admin');
}

public static function canDetach(): bool
{
    return auth()->user()->hasRole('admin');
}

۷. افزودن عملیات سفارشی

می‌توانید عملیات سفارشی مانند تایید برچسب‌ها، حذف برچسب‌ها از طریق عملیات جمعی، و غیره را به Relation Manager اضافه کنید.

Tables\Actions\Action::make('approve')
    ->label('تایید')
    ->action(function (Tag $record) {
        $record->update(['approved' => true]);
    })
    ->requiresConfirmation()
    ->color('success'),

نتیجه‌گیری

در این مقاله، به بررسی جامع و کامل رابطه‌ها (Relations) در Filament پرداختیم و نحوه مدیریت انواع مختلف این روابط را از سطح مبتدی تا پیشرفته معرفی کردیم. با استفاده از Relation Managers، شما توانستید به طور ساده و کارآمد روابط بین مدل‌ها را مدیریت کنید. همچنین، با توضیح و پیاده‌سازی عملی روابط hasMany و belongsToMany، نشان دادیم که چگونه می‌توان به صورت مؤثری داده‌های مرتبط را در پروژه‌های خود مدیریت و نمایش داد.

رابطه‌ها (Relations) در Filament ابزارهای قدرتمندی را در اختیار توسعه‌دهندگان قرار می‌دهد که با کمک آن‌ها می‌توانند ساختارهای داده‌ای پیچیده را به شکلی سازمان‌یافته و کاربرپسند مدیریت کنند. این روابط نه تنها به بهبود کارایی و یکپارچگی داده‌ها کمک می‌کنند، بلکه تجربه کاربری بهتری را نیز برای کاربران نهایی فراهم می‌آورند.

با بهره‌گیری از نکات پیشرفته و بهترین روش‌های معرفی شده در این مقاله، می‌توانید پروژه‌های خود را به سطح بالاتری ارتقاء دهید و از امکانات گسترده رابطه‌ها (Relations) در Filament به بهترین نحو استفاده کنید. در نهایت، تسلط بر رابطه‌ها (Relations) در Filament یکی از کلیدهای موفقیت در توسعه برنامه‌های وب مدرن است. امیدواریم این مقاله بتواند راهنمایی مفیدی برای شما در مسیر یادگیری و به‌کارگیری این مفاهیم باشد و شما را در ایجاد پروژه‌های قدرتمند و کارآمد یاری کند.

آموزش رابطه‌ها (Relations) در Filament

دیدگاه های شما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *