hamed sarkhosh
6 سال پیش توسط hamed sarkhosh مطرح شد
4 پاسخ

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

سلام دوستان. من به یه مشکلی برخورد کردم که هرچقدر گشتم جوابی نتونستم براش پیدا کنم خواستم از شما راهنمایی بگیرم.
من یه 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'));
    }

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


ثبت پرسش جدید
محمد صادقیان
تخصص : برنامه نویس وب - فریم ورک Lara...
@drcode.ir 6 سال پیش آپدیت شد
1

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

public function destroy(Courses $course)

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

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

Alimotreb
تخصص : کانفیگ سرور و برنامه نویس
@Alimotreb 6 سال پیش مطرح شد
1

سلام
@ham.sarkhosh

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

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

dd()

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


محمد صادقیان
تخصص : برنامه نویس وب - فریم ورک Lara...
@drcode.ir 6 سال پیش آپدیت شد
1

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

public function destroy(Courses $course)

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

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

hamed sarkhosh
تخصص : برنامه نویس
@ham.sarkhosh 6 سال پیش مطرح شد
0

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

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


hamed sarkhosh
تخصص : برنامه نویس
@ham.sarkhosh 6 سال پیش مطرح شد
0

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


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

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