جشنواره عیدانه راکت | عضویت ویژه راکت برای آخرین بار | افزایش قیمت‌ها از سال جدید | و ...

مشاهده اطلاعات بیشتر...
ثانیه
دقیقه
ساعت
روز
علی بیات
4 سال پیش توسط علی بیات مطرح شد
45 پاسخ

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

درود دوستان

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

بنده اخیرا پکیجی به نام 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 گیت و یا در این گفتگو اون رو عنوان کنید.


ثبت پرسش جدید
Hamid Ghiasifar
@hghiasifar 4 سال پیش مطرح شد
0

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


Hamid Ghiasifar
@hghiasifar 4 سال پیش مطرح شد
0

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


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش آپدیت شد
0

@hghiasifar

بدون اینکه چیزی اضافه کنید .. از هم متمایز هستند.. تنها اسم های دسته بندی ها ممکنه یکسان باشه..

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

  • اول دسته بندی رو پیدا میکنید
  • بعد از متد entries استفاده میکنید و کلای مورد نظر رو بهش پاس میدید:
    $categoryPosts = Category::find(1)
        ->entries(Post::class)
        ->get();
  • مقداری که بر میگردونه یه Collection هست که میتونید دقیقا مثل سایر Collection ها در لاراول ازش استفاده کنید

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

پکیج Laravel Categorizable به تازگی آپدیت شده و حالا با لاراول نسخه ۷ هم سازگار هست.


محمد نمازی
تخصص : توسعه دهنده وب
@mnamazi 4 سال پیش مطرح شد
0

@ali.bayat

سلام
اگر بخوام چند نوع دسته بندی داشته باشم، روش کار چیه ؟ و چه تغییراتی باید بدم ؟
یعنی یه نوع دسته بندی برای مقالات، محصولات و ... نیاز دارم.


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

@mnamazi
در اون صورت به یک جدول برای لیست دسته بندی های جدید و یک مدل برای کار با اون جدول نیاز دارید..
البته برای نسخه جدید پکیج همچین ویژگی در نظر گرفته شده


محمد نمازی
تخصص : توسعه دهنده وب
@mnamazi 4 سال پیش مطرح شد
0

@ali.bayat
فکرکنم منظورمو متوجه نشدید، برای هر کدام از مدل ها ( مثلا مقالات، محصولات و ... )، یه دسته بندی جداگانه نیاز دارم
نسخه جدید کی ارائه میشه ؟


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

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

دقیقا مشخص نیست نسخه جدید کی منتشر بشه


علیرضا حسینی
تخصص : برنامه نویس
@alirezahsi 4 سال پیش آپدیت شد
0

@ali.bayat
سلام مرسی از پکیج خیلی خوبی که زحمت کشیدید و طراحی کردین،داشتم مستنداتو میدیدم سوال شد اگه بخوایم لیست دسته بندی های یک مدل خاص رو بگیریم چکاری باید کرد؟ نه به طریقی که آی دی بدیم که ذکر کردین بگیم دسته بندی هایی که در pivot-table بین دسته بندی و مدل ها هست اون هایی که type مثلا app/article دارند رو بگیر؟ هرچی هست


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

@zahed
در حال حاظر دسته بندی ها بین مدل ها مشترک هستند..


مجید
تخصص : برنامه نویس php , laravel,java...
@MAJIDKALI 3 سال پیش آپدیت شد
0

@ali.bayat
سلام من دارم از پکیج استفاده می کنم حذف دسته ها یک مشکل دارم دقیقا طبق داکومنت انجام میدم اما این ارور رو بعد از حذف دسته بر می گردونه البته توی issue گیت هاب پکیج Kalnoy\Nestedset\ این رو حل کردن چطور میشه این مشکل رو حل کرد

‍‍‍Declaration of Kalnoy\Nestedset\BaseRelation::getRelationQuery(Illuminate\Database\Eloquent\Builder $query, Illuminate\Database\Eloquent\Builder $parent, $columns = Array) should be compatible with Illuminate\Database\Eloquent\Relations\Relation::getRelationQuery() {"userId":1,"exception":"[object] (ErrorException(code: 0): Declaration of Kalnoy\\Nestedset\\BaseRelation::getRelationQuery(Illuminate\\Database\\Eloquent\\Builder $query, Illuminate\\Database\\Eloquent\\Builder $parent, $columns = Array) should be compatible with Illuminate\\Database\\Eloquent\\Relations\\Relation::getRelationQuery() at /home/majid/Documents/development/app/new/online-market/vendor/kalnoy/nestedset/src/BaseRelation.php:121)


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

@MAJIDKALI
سلام. به چه شکل می‌خواهی دسته رو حذف کنی که این اکسپشن رو میگیری؟


علیرضا
تخصص : برنامه نویس
@alirezashekofteh 3 سال پیش مطرح شد
0

عالی بود و تشکر فقط با لاراول ۸ که مشکلی نداره؟


مجید
تخصص : برنامه نویس php , laravel,java...
@MAJIDKALI 3 سال پیش آپدیت شد
0

@ali.bayat
این کدی هست که من می خواهم یک دسته رو حذف کنم البته اینم بگم که دسته حذف میشه اما این ارور هم بعد از حذف ارسال میشه

$category = Category::findById($id);
 $category->delete();

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

@alirezashekofteh
کاملا با لاراول ۸ سازگاره


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

@MAJIDKALI
اکسپشنی که میگیری مربوط به پکیج Nestedset هست
راه حل موقت: میتونی با یه try catch خطا رو مدیریت کنی
من با نسخه های ۶،۷ و ۸ امتحان کردم چنین مشکلی نداشتم، ولی بررسیش میکنم


مجید
تخصص : برنامه نویس php , laravel,java...
@MAJIDKALI 3 سال پیش مطرح شد
0

خیلی ممنون @ali.bayat
من فعلا همون trycatch رو استفاده می کردم اما فکر کنم پکیج Nestedset این رو حل کرده


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

@MAJIDKALI

نسخه ۵ پکیج laravel-nestedset یک مشکل سازگاری با نسخه های جدید لاراول داشت..
پکیج مورد استفاده به آخرین نسخه (۶) آپدیت شد و مشکل پکیج Categorizable هم حل شد.. اگر پکیج رو آپدیت کنی، میتونی بدون اون try catch هم ازش استفاده کنی.

سپاس بابت اطلاع رسانی


مجید
تخصص : برنامه نویس php , laravel,java...
@MAJIDKALI 3 سال پیش مطرح شد
1

@ali.bayat
خیلی ممنون بابت پشتیبانی عالی تون


مجید
تخصص : برنامه نویس php , laravel,java...
@MAJIDKALI 3 سال پیش مطرح شد
0

@ali.bayat

سلام چطور میشه مشکل اسلاگ فارسی رو برای دسته بندی ها حل کرد از spatie/laravel-sluggable برای ایجاد slug استفاده کردید اما برای فارسی کردن اسلاگ هیچ اپشن در نظر نگرفتید


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

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