محمدسجاد دباغ
3 سال پیش توسط محمدسجاد دباغ مطرح شد
12 پاسخ

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

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

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

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

1   program     0
2   website     1
3    backend     2

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

$allCategory = Workshop_category::where('parent_id', '???');

ثبت پرسش جدید
محمدسجاد دباغ
تخصص : برنامه نویس لاراول
@mdabbagh 3 سال پیش مطرح شد
0

حل شد.

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>

حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 3 سال پیش مطرح شد
1

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


Muhammad
تخصص : Back-End Developer
@muhammad 3 سال پیش آپدیت شد
0

سلام.

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

  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 3 سال پیش مطرح شد
0

@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
تخصص : Back-End Developer
@muhammad 3 سال پیش مطرح شد
0

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

Category::whereNotIn('id', function ($query) {
    $query->select('parent_id')->whereNotNull('parent_id');
})->get();

محمدسجاد دباغ
تخصص : برنامه نویس لاراول
@mdabbagh 3 سال پیش مطرح شد
-1

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

متشکرم


محمدسجاد دباغ
تخصص : برنامه نویس لاراول
@mdabbagh 3 سال پیش مطرح شد
0

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

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

Muhammad
تخصص : Back-End Developer
@muhammad 3 سال پیش آپدیت شد
0

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

->where('parent_id', '<>', 0);

محمدسجاد دباغ
تخصص : برنامه نویس لاراول
@mdabbagh 3 سال پیش مطرح شد
0

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


Muhammad
تخصص : Back-End Developer
@muhammad 3 سال پیش آپدیت شد
0

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

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

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


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 3 سال پیش آپدیت شد
0

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


محمدسجاد دباغ
تخصص : برنامه نویس لاراول
@mdabbagh 3 سال پیش مطرح شد
0

@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 بود ، رکورد نمایش داده بشه. که در این مورد منبع معرفی شده توضیحی ندادند.


محمدسجاد دباغ
تخصص : برنامه نویس لاراول
@mdabbagh 3 سال پیش مطرح شد
0

حل شد.

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>

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

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