راکت
حل شده

دریافت لیست زیردسته های آخر

12 پاسخ

سلام
جدول دسته بندی ها به این شکله

protected $fillable = ['id_category' ,'name' , 'parent_id'];

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

1   program     0
2   website     1
3    backend     2

حالا با چه دستوری میتونم لیست آخرین سطح هر دسته رو بگیرم؟

$allCategory = Workshop_category::where('parent_id', '???');
ثبت پرسش جدید

پاسخ‌ها

12
محمدسجاد دباغ
محمدسجاد دباغ
@mdabbagh

تخصص: برنامه نویس لاراول

بهترین پاسخ

حل شد.

model
public function child()
{
    return $this->hasMany(Workshop_category::class , "parent_id" , "id");
}
blade
<select class="form-control" name="category_parent" id="">
    <option value="0" selected>دسته بندی دوره</option>
    @foreach($allCategory as $item)
        @if($item->child->count() == 0)
            <option value="{{ $item->id }}">{{ $item->name }}</option>
        @else
            <option value="{{ $item->id }}" disabled>{{ $item->name }}</option>
        @endif
    @endforeach
</select>
حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

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

Muhammad
Muhammad
@muhammad

تخصص: Back-End Developer

سلام.

اول بذارین دو نکته بگم:

  1. اسم ستون idcategory اشتباهه چون توی انگلیسی برعکس فارسیه و باید بگین categoryid، مثل parentid که ننوشتین idparent. من خودم طرفدار اینم که برای کلید اصلی فقط از id استفاده بشه و اسم جدول به شکل پیشوند اضافه نشه، هرچند توی کتاب Karwin Bill دیدم که اسم جداول رو به شکل پیشوند آوردن.
  2. برای ستون parentid از null به جای 0 استفاده کنین. کافیه که توی مایگریشن ()nullable گذاشته باشین.

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

SELECT *
FROM categories
WHERE id NOT IN (SELECT parent_id FROM categories WHERE parent_id IS NOT NULL);

توی این کوئری SQL که نوشتم، از یه subquery استفاده کردم. فقط دسته‌بندی backend رو برمی‌گردونه که سطح آخره و هیچ فرزندی نداره.

شاید پاسخ شما همین‌جا باشد

محمدسجاد دباغ
محمدسجاد دباغ
@mdabbagh

تخصص: برنامه نویس لاراول

@muhammad
متشکرم از پاسخت
من id_category ندارم و id هست اما اینجا که سوال بهتر درک بشه این طوری گفتم.
این کوئری که نوشتید با laravel چطوری میشه؟

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

public function child()
    {
        return $this->hasMany(Workshop_category::class , "parent_id" , "id");
    }

و هنگام فراخوانی

<select class="form-control" name="category_parent" id="">
    <option value="0" selected>دسته بندی اصلی</option>
    @foreach($allCategory as $item)
        @if($item->child->count())
        <option value="{{ $item->id }}">{{ $item->name }}</option>
        @endif
    @endforeach
</select>

با ارور زیر موجه میشم

htmlspecialchars() expects parameter 1 to be string, array given
Muhammad
Muhammad
@muhammad

تخصص: Back-End Developer

این رو تست کنین:

Category::whereNotIn('id', function ($query) {
    $query->select('parent_id')->whereNotNull('parent_id');
})->get();
محمدسجاد دباغ
محمدسجاد دباغ
@mdabbagh

تخصص: برنامه نویس لاراول

@hosseinshirinegad98
سلام دوست من
بله درسته تازه وارد هستم.
سبک یادگیری من پروژه محور هست ، به این معنی که با تعریف پروژه برای خودم و شروع به پیاده سازی در طول مسیر به هر چالشی برخورد کردم در مورد همان چالش تحقیق (ویدئو ، مقاله ، پرسش سوال و ...)کنم.
خوش حال میشم منابع مورد نظرتون در مورد این چالش رو اینجا معرفی کنید چون من قبلا مباحثی که گفتید رو تحقیق کردم اما این چالش بیان نشده بود.( احتمالا منابع من کامل نبوده) لطفا منبع خوب معرفی کنید.

متشکرم

محمدسجاد دباغ
محمدسجاد دباغ
@mdabbagh

تخصص: برنامه نویس لاراول

@muhammad
با دستور زیر هم website و هم backend برگشت.

$lastLevelCategory = Workshop_category::whereNotIn('id', function ($query) {
        $query->select('parent_id')->where('parent_id' , '0');
})->get();
Muhammad
Muhammad
@muhammad

تخصص: Back-End Developer

@msdabbagh
توجه کنین که شما به جای whereNotNull یه where گذاشتین و گفتین اونجا که صفره! باید اینطور می‌ذاشتین:

->where('parent_id', '<>', 0);
محمدسجاد دباغ
محمدسجاد دباغ
@mdabbagh

تخصص: برنامه نویس لاراول

@muhammad
الان فقط سطح اول برگشت (program)

Muhammad
Muhammad
@muhammad

تخصص: Back-End Developer

@msdabbagh
ببخشین من یه اشتباه ریز کرده بودم.
این رو امتحان کنین:

Category::whereNotIn('id', function ($query) {
    $query->from('categories')->select('parent_id')->where('parent_id', '<>', 0);
})->get();

کدش رو که چک کردم، فهمیدم subquery به جدول رجوع نمی‌کنه برای همین from رو اضافه کردم.

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

سلام
این جمله رو در گوگل تایپ کنید و وارد اولین لینک شوید.
آموزش رابطه ها در لاراول رکسو
شما در مسئله بالا به رابطه یک به چند نیاز دارید.
در این سایت که گفتم یک دوره مناسب آموزش لاراول مقاله وار و رایگان در دسترس است.
متاسفانه امکان ارسال لینک مقاله مقدور نبود

محمدسجاد دباغ
محمدسجاد دباغ
@mdabbagh

تخصص: برنامه نویس لاراول

@hosseinshirinegad98
متشکرم لینک https://www.roxo.ir/relationships-laravel-part-one رو مطالعه کردم اما در مورد نحوه صحیح فراخوانی کد زیر در blade اشاره ای نکرده بود.

public function comments()
{
    return $this->hasMany('App\Comment');
}

و تنها گفته بود که میتوان به شکل زیر به comments دسترسی داشت.

$comments = App\Post::find(1)->comments;

foreach ($comments as $comment) {
    //
}

اما طبق چالش من نیاز بود این عملیات بدون find(1) انجام بشه ، به این معنی که لیست همه فرزند ها بیاد و اگر

$item->child->count() 

برابر 0 بود ، رکورد نمایش داده بشه. که در این مورد منبع معرفی شده توضیحی ندادند.

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

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