راکت
علی بیات
علی بیات
6 سال پیش توسط علی بیات مطرح شد
47 پاسخ

دسته‌بندی مدل‌های الکوئنت در لاراول ۶

درود دوستان

من پس از بارها پیاده سازی فیچِر دسته بندی‌ها در پروژه های مختلف، به این نتیجه رسیدم که سورس کد این فیچر را به یک پکیج لاراولی تبدیل کنم.

بنده اخیرا پکیجی به نام Laravel Categorizable منتشر کردم. این پکیج کاملا با نسخه ۶ لاراول سازگار است و با بهره گیری از روابط چندریختی (Polymorphism) این امکان را به ما می‌دهد که: هر مدلی که خواستیم را دسته بندی کنیم. به عبارت دیگر در یک اپلیکیشن لاراولی می‌توانیم پست‌ها، محصولات، ویدیو‌ها و هر تعداد مدل دیگر که نیاز داریم را براحتی دسته بندی‌ کنیم; با این پکیج همچنین ساخت، به روزرسانی و حذف دسته بندی‌ها به راحتی قابل انجام است.


نصب پکیج

برای نصب از طریق کامپوزر:

composer require alibayat/laravel-categorizable

سپس پابلیش کردن و اجرای مایگریشن:

php artisan vendor:publish --provider="AliBayat\LaravelCategorizable\CategorizableServiceProvider"
php artisan migrate

آماده سازی مدل

تنها کافیست از تریت پکیح در مدل مورد نظر استفاده کنیم:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use AliBayat\LaravelCategorizable\Categorizable;

class Post extends Model
{
    use Categorizable;

}

به همین سادگی ما قابلیت دسته‌بندی شدن رو به مدل Post اضافه کردیم. با این کار یک سری متد ها که مربوط به این فیچر هستند به مدل ما اضافه میشه


مدیریت دسته‌بندی‌ ها

برای نمایش متدها، نیاز به ساخت چند دسته‌بندی داریم. در زیر نحوه ساخت و حذف دسته‌بندی ها را به علاوه ساخت دسته‌بندی ها به حالت والد و فرزند (دسته‌بندی های تو در تو (Nested)) مرور می‌کنیم:

<?php

use AliBayat\LaravelCategorizable\Category;

// create "BackEnd" category
Category::create([
    'name' => 'BackEnd'
]);

// create "PHP" category
Category::create([
    'name' => 'PHP'
]);

// create "FrontEnd" category
Category::create([
    'name' => 'FrontEnd'
]);

// create "Test" Category (alternative way)
$test = new Category();
$test->name = 'Test';
$test->save();

// assign "PHP" as a child of "BackEnd" category
$parent = Category::findByName('BackEnd');
$child = Category::findByName('PHP');
$parent->appendNode($child);

// delete "Test" Category
$testObj = Category::findByName('Test');
$testObj->delete();

طریقه دسته‌بندی مدل‌ها

حال که دسته‌بندی ها را ساختیم، چند متغیر را مقداردهی میکنیم و سپس عملکرد متد ها را بررسی می‌کنیم:

<?php

use App\Post;
use AliBayat\LaravelCategorizable\Category;

$post = Post::first();

// ۳ different ways of getting a category's instance
$backendCategory = Category::findById(۱);   // 'BackEnd'
$phpCategory = Category::findByName('PHP'); // 'PHP'
$frontendCategory = Category::find(۳);      // 'FrontEnd'

حال برای...

افزودن پست به یک دسته بندی:

    $post->attachCategory($phpCategory);

حذف پست از یک دسته‌بندی:

    $post->detachCategory($phpCategory);

افزودن پست به چند دسته‌بندی:

    $post->syncCategories([
        $phpCategory,
        $backendCategory
        ]); 

حذف پست از تمام دسته‌بندی ها:

    $post->syncCategories([]); 

بررسی پیوست پست به دسته‌بندی ها:

    $post->hasCategory($phpCategory);

    $post->hasCategory([
        $phpCategory,
        $backendCategory
        ]);

    // return boolean

لیست دسته‌بندی های پیوست شده به یک پست:

    $post->categoriesList();

    // return array [id => name]

لیست پست‌های پیوست شده به یک دسته‌بندی:

    $categoryPosts = Category::find(۱)
        ->entries(Post::class)
        ->get();

    // return collection

مستندات پکیج در ریپازیتوری گیت‌هاب موجود است:
https://github.com/AliBayat/Laravel-Categorizable

در صورت پیدا کردن هر گونه باگ می‌تونید در قسمت Issues گیت و یا در این گفتگو اون رو عنوان کنید.


ثبت پرسش جدید
tresa021
tresa021
تخصص :Professional PHP Developer
@claymore04656 سال پیشمطرح شد
1

جالب بود ولی چرا این تصمیم رو گرفتید ک پکیجش کنید ؟!!!


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat6 سال پیشمطرح شد
0

@claymore0465

در اکثر اپلیکیشن های تحت وب دسته‌بندی ها (Categories) نقش مهمی ایفا می‌کنند. در یک بلاگ ساده، یک فروشگاه اینترنتی، یک سیستم آموزشی و حتی سامانه‌های شخصی سازی شده و غیره مفهوم دسته بندی همیشه حظور دارد; مثلا در یک بلاگ، پست‌ها می‌توانند در دسته بندی‌ های خاص خود باشند و همین طور محصولات یک فروشگاه، مقالات آموزشی یک موسسه و ...

میشه گفت عدم اختراع دوباره چرخ، یکی از دلایلش هست


عرفان همتی
عرفان همتی
تخصص :Backend Developer
@erfanhemmati6 سال پیشمطرح شد
0

@ali.bayat
آیا امکان پیاده سازی دسته بندی ها به صورت زیر دسته (به صورت نامحدود) امکان پذیر هستش ؟


حسین شفیعی
حسین شفیعی
تخصص :توسعه دهنده لاراول
@hshafiei3746 سال پیشمطرح شد
1

خوبه برای هر دسته بندی امکان قرار دادن یک آیکن و یک تصویر رو هم قرار بدید. در کل پکیج شما عالیه و متد هایی که براش نوشتین هم کافیه تا حد زیادی


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat6 سال پیشمطرح شد
1

@mrerfan.ir
درود
بله ممکنه. و همچنین دریافت ساختار دسته‌بندی ها به شکل درختی و به شکل Flat هم ممکنه.


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat6 سال پیشمطرح شد
1

@hshafiei374
سپاس، نظر لطف شماست.
اضافه کردن آیکن هم ایده جالبیه


mahdi khanzadi
mahdi khanzadi
تخصص :Software engineer
@khanzadimahdi6 سال پیشمطرح شد
1

خیلی خوبه. حتما توی پروژه های بعدی ازش استفاده میکنم :)


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat6 سال پیشمطرح شد
0

@khanzadimahdi

درود و سپاس بابت نظر خوب شما آقای خانزادی.


GHM
GHM
تخصص :دولوپر نیمه‌استک
@GHM6 سال پیشمطرح شد
1

@ali.bayat بنده لاراول کار نمیکنم اما حمایت و تشکر میکنم بابت این کار خوب


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat6 سال پیشمطرح شد
0

@GHM

سپاس‌گذارم دوست عزیز، لطف دارید


Alimotreb
Alimotreb
تخصص :کانفیگ سرور و برنامه نویس
@Alimotreb6 سال پیشمطرح شد
1

سلام
@ali.bayat

بسیار عالی ، کاربردی! حتما استفاده میکنم


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat6 سال پیشمطرح شد
0

@Alimotreb

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


امیرحسین فلاحی
امیرحسین فلاحی
تخصص :توسعه دهنده وب
@amhfallahi.dev6 سال پیشمطرح شد
1

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


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat6 سال پیشمطرح شد
0

@amhfallahi

درود و سپاس
دقیقا.. من به دفعات خودم این کار رو انجام داده‌ ام.. تا اینکه این پکیج رو در قالب یه ریپازیتوری private منتشر کردم.
به لطف Github عزیز که امکان استفاده از ریپازیتوری های private رو برای ایران و ۳ کشور دیگه محدود کرد، این پکیج هم به نوع Public تبدیل شد.


حسین شفیعی
حسین شفیعی
تخصص :توسعه دهنده لاراول
@hshafiei3746 سال پیشمطرح شد
1

@ali.bayat اسم جداولت رو در پکیج هات با یه پرفیکس بزار تا اگه کسی تو پروژش مثل من به هر دلیلی یه جدول categories دیگه داشت با این به مشکل نخوره مثلا بزار bayat_categories


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat6 سال پیشمطرح شد
1

@hshafiei374
درسته اسم جدولها ممکنه تداخل داشته باشند.. در آپدیت بعدی یه فکری به حالش می‌کنم.

اما تا اون موقع برای استفاده از پکیج میتونید بعد از نصب با کامپوزر و پابلیش کردن فایلها...
قبل از مایگریت کردن.. فایل مایگریت رو باز کنید

و اسم جدول اول رو تغییر بدید.
بعدش مایگریت کنید

تنها کاری که میمونه اینه که فایل "vendor\alibayat\laravel-categorizable\src\Category.php" رو باز کنید و اسم پیش‌فرض جدول رو عوض کنید:

class Category extends Model
{
    protected $table = 'newTableName';

}

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


علی باقری
علی باقری
تخصص :برنامه نویس وب
@alibagheri6 سال پیشمطرح شد
1

سلام .
به به چه پکیج خوب و کاربردی واقعا نیاز بود .. ممنون از شما


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat6 سال پیشمطرح شد
0

@alibagheri

درود آقای باقری
سپاس از لطف شما


حساب مشترک
حساب مشترک
تخصص :برنامه نویس وب و موبایل
@amirali.hannan6 سال پیشمطرح شد
0

@ali.bayat
سلام جناب بیات ، خسته نباشید .
سوالی پیش آمده برام .
اینکه چطور میشه دسته ای ساخت که والدش دسته دیگه ای باشه تو متد ها فقط یدونه name گزاشتید خبری از parent نبود البته هنوز پکیجو نصب و مایگریت نکردم ؟
چطور میشه دسته بندی هارو به حالت درختی یا dropdown نمایش داد؟ اگه کد آماده ای هست مثلا برای نمایش تو صفحه اصلی اینجا منتشر کنید تا استفاده کنیم .
تشکر


علی بیات
علی بیات
تخصص :توسعه دهنده ارشد وب
@ali.bayat6 سال پیشمطرح شد
0

@amirali.hannan

درود

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

$parent = Category::findByName('BackEnd');
$child = Category::findByName('PHP');

و در نهایت با متد apendNode ... یکی رو به عنوان والد دیگری ثبت کنید:

$parent->appendNode($child);

با متدهای زیر هم میتونید روابط والد و فرزند رو بررسی کنید:

$category->isChildOf($otherCategory);
$category->isAncestorOf($otherCategory);
$category->isSiblingOf($otherCategory);

و برای دریافت دسته بندی های والد و فرزند هم به ۴ نوع رابطه بین جداول دسترسی دارید که به شرح زیر هست

  • parent
  • children
  • ancestors
  • descendants

براحتی میتونید از این روابط استفاده کنید

Category::findByName('php')->parent;

و یا حتی میتونید داده ها رو Eager load کنید:

 Category::with('ancestors')->get()

همچنین یه سری اِسکوپ هم برای این روابط وجود داره

  • ancestorsOf
  • descendantsOf
    $backEnd = Category::findByName('Backend');
    Category::descendantsOf($backEnd);

صفحه 1 از 3

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

ورود یا ثبت‌نام