عدم عملکرد صحیح resource controller

- 1 هفته پیش
توسط hamed sarkhosh آپدیت شد
hamed sarkhosh ( 1970 تجربه )
1 هفته پیش

سلام دوستان. من به یه مشکلی برخورد کردم که هرچقدر گشتم جوابی نتونستم براش پیدا کنم خواستم از شما راهنمایی بگیرم.
من یه model به اسم courses دارم و با یک کنترلر resourse می خوام تو پنل مدیریتم یک سری دوره هارو مدیریت کنم. مشکل اینجاس که زمان ویراش کردن یا delete کردن route model binding من کار نمی کنه و اطلاعاتی را حذف نمی کنه (به طور کلی می شه گفت اصلا اطلاعاتی رو بر نمی گردونه از دیتابیس!)
نحوه کارمم اینجوری بوده که با چنین فرمی میرم به route مورد نظر و اطلاعات رو به کنترلر برای انجام تغییرات ارسال می کنم

<form action="{{ route('courses.destroy'  , ['id' => $course->id]) }}" method="post">

                                {{ method_field('DELETE') }}
                                {{ csrf_field() }}
                                <div class="btn-group btn-group-xs">
                                    <a href="{{ route('courses.edit' , ['id' => $course->id]) }}"  class="btn btn-primary">ویرایش</a>
                                    <button type="submit" class="btn btn-danger">حذف</button>
                                </div>
                            </form>

بعدش داخل کنترلرم به این صورت باید course مورد نظرمو دریافت کنم و مثلا عملیات delete رو انجام بدم

    public function destroy(Courses $courses)
    {
        $courses->delete();
    }

ولی خب تا اونجایی که مشخصه به route مورد نظرم میره ولی $courses هیچ اطلاعاتی رو برگشت نمی ده اصلا !
البته با یک روش دیگه کار رو انجام دادم و به نتیجه رسیدم. با این روش :

    public function destroy($id)
    {
        $course = Courses::find($id);
        $course->delete();
        return redirect(route('courses.index'));
    }

ولی خب می خوام بدونم علت چیه که اون روش اصلی که تا امروز خیلی هم خوب کار می کرد و ازش استفاده می کردم الان کار نمی کنه ! نمی فهمم مشکل کارم کجاست !

بهترین پاسخ انتخاب شده توسط hamed sarkhosh
محمد صادقیان
1 هفته پیش

در تابع خودتون به شکل زیر عمل کنید :

public function destroy(Courses $course)

یعنی $courses رو به $course تغییر بدید.

  • یک مورد مهم هم این هست که شما نام Model خودتون رو جمع گذاشتید که این کار اصولی نیست برای این فریم ورک.
    یعنی وقتی شما نام جدولتون courses هست باید نام مدل شما course باشه در غیر اینصورت باید به روش زیر در مدل مرربوطه اون جدول رو براش تعریف کنید.
    protected $table = 'courses';
Alimotreb ( 41942 تجربه )
1 هفته پیش

سلام
@ham.sarkhosh

کد route model binding رو که در لاراول قرار دادید رو هم بزارید

میتونید غیر از این روش route model binding از روش های دیگه هم استفاده کنید
request مورد نظر رو بگیرید
تو متد destroy یا update
از مدل مورد نظر یه شی بسازید و .... کار هارو روش انجام بدید
مرحله به مرحله از کدتون

dd()

بگیرید و خروجی رو ببینید.

محمد صادقیان ( 16645 تجربه )
1 هفته پیش

در تابع خودتون به شکل زیر عمل کنید :

public function destroy(Courses $course)

یعنی $courses رو به $course تغییر بدید.

  • یک مورد مهم هم این هست که شما نام Model خودتون رو جمع گذاشتید که این کار اصولی نیست برای این فریم ورک.
    یعنی وقتی شما نام جدولتون courses هست باید نام مدل شما course باشه در غیر اینصورت باید به روش زیر در مدل مرربوطه اون جدول رو براش تعریف کنید.
    protected $table = 'courses';
hamed sarkhosh ( 1970 تجربه )
1 هفته پیش

@Alimotreb منظورتون رو از کد route model binding متوجه نمی شم! کدوم قسمت رو باید قرار بدم ؟

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

hamed sarkhosh ( 1970 تجربه )
1 هفته پیش

@drcode.ir
خیلی ممنونم ازتون. کاملا درسته. حق با شما بود. وقتی متغییر رو به course تغییر دادم مشکل برطرف شد.
خیلی برام جالب بود این نکته. اصلا تا حالا بهش هیچ توجهی نکرده بود.
بازم ممنونم از راهنماییون

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