انتخاب پست ها با حداقل یک دسته relashanship many to many

2 روز پیش
توسط سعید آپدیت شد
سعید ( 17580 تجربه )
2 روز پیش
تخصص : برنامه نویس وب

@ali.bayat @hossein.r.1442 @hesammousavi @milad @elyasbeshkani @juza66 @rezajashnsaz0011 @endworld @mohsenbostan @alireza.mzh @bahrami.nasrin90 و بقیه دوستان ..

سلام به همه دوستان
ببینید دوستان من بین post ها و category ها رابطه چند به چند ایجاد کردم.
حالا اگر در هنگام سرچ ، بخوام همه پست هایی که حداقل دسته ای مشخصی دارند رو از دیتابیس بگیر از چه دستوری می تونم استفاده کنم.
کار برام یخورده سخت شده چون ، هر پست ممکنه چندین دسته داشته باشه و در عین حال ما میخوایم پست هایی رو بگیریم که حداقل ، دسته ای رو که مشخص میکنیم داشته باشن.
مثلا فرض کنید کاربر دسته لاراول رو انتخاب میکنه ، باید پست هایی که حداقل دسته لاراول رو دارند رو بهش نشون بدیم.
ممنون میشم راهنمایی بفرمایید

بهترین پاسخ انتخاب شده توسط سعید
Mohammad Amin Mokhtari
2 روز پیش

بله
کد زیر رو امتحان کنید

    Post::whereHas('categories', function (Builder $query) {
        $query->whereIn('name', ['laravel','php']);
    })
    ->whereTitle('some title')
    ->whereType('some type')
    // ->Where Other Conditions
    ->paginate(10);
  • در این کد 'categories' نام جدول دسته بندی هاست
  • همانطور که می بینید می توان از چند دسته بندی نیز برای جستجو استفاده کرد که در این مثال 'laravel','php' آورده شده است
  • کد whereTitle('some title') مانند where('title','some title') یا where('title','==','some title') عمل می کند
Mohammad Amin Mokhtari ( 3020 تجربه )
2 روز پیش
تخصص : برنامه نویس

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

Category::where('name','laravel')->firstOrFail()->posts
سعید ( 17580 تجربه )
2 روز پیش
تخصص : برنامه نویس وب

@amin.mokhtari94

آیا دقیقا نمیشه روی خود مدل post ، شرط رو قرار بدیم.
چون میخوام برای سرچ استفاده کنم و شروط دیگه ای هم هستن .
و تمامی شروط روی مدل post قرار گرفتن.

سعید ( 17580 تجربه )
2 روز پیش
تخصص : برنامه نویس وب

فرض کنید این کد ماست :

Post::whereApproved(2)
            ->when(\request()->get('type') , function ($q) {
                if (\request()->get('type') == 'like'){
                    $q->orderBy('like_view','desc');
                }
            })
            ->when(\request()->get('catId') , function ($q) {
                // درخواست کاربر برای دریافت پست هایی که حداقل دسته (فلان) را داشته باشن
            })->paginate(10);
Mohammad Amin Mokhtari ( 3020 تجربه )
2 روز پیش
تخصص : برنامه نویس

بله
کد زیر رو امتحان کنید

    Post::whereHas('categories', function (Builder $query) {
        $query->whereIn('name', ['laravel','php']);
    })
    ->whereTitle('some title')
    ->whereType('some type')
    // ->Where Other Conditions
    ->paginate(10);
  • در این کد 'categories' نام جدول دسته بندی هاست
  • همانطور که می بینید می توان از چند دسته بندی نیز برای جستجو استفاده کرد که در این مثال 'laravel','php' آورده شده است
  • کد whereTitle('some title') مانند where('title','some title') یا where('title','==','some title') عمل می کند
سعید ( 17580 تجربه )
2 روز پیش
تخصص : برنامه نویس وب

@amin.mokhtari94
ممنون از پاسختون
من نمونه کد زیر رو اجرا کردم و با ارور برخورد کردم :

Post::whereApproved(2)
    ->when(\request()->get('type') , function ($q) {
        if (\request()->get('type') == 'new'){
            $q->orderBy('created_at','desc');
        }elseif (\request()->get('type') == 'old'){
            $q->orderBy('created_at','asc');
        }
    })
   ->when(\request()->get('catId') , function ($q) {
                $q->whereHas('category', function (Builder $query){
                    $query->whereId(request()->get('catId'));
                });
            })
->paginate(10);

نام تابع ralation من در مدل پست category هست برای همین، category نوشتم.
و باید بگم کاربر فقط id یک دسته را میفرستد.

ارور :

Argument 1 passed to App\Http\Controllers\Pages\PostsController::App\Http\Controllers\Pages\{closure}() must be an instance of Illuminate\Database\Query\Builder, instance of Illuminate\Database\Eloquent\Builder given, called in 
سعید ( 17580 تجربه )
2 روز پیش
تخصص : برنامه نویس وب

@amin.mokhtari94

اهااااا
اوکی ، ظاهرا Builder رو اشتباها use کرده بودم
واقعا ممنون

برای ارسال پاسخ باید وارد سایت شوید