Paradox
2 سال پیش توسط Paradox مطرح شد
13 پاسخ

اپلود فایل در لاراول

سلام دوستان من برای اپلود فایل از روش زیر استفاده کردم
و این ارور نمایش میده
لطفا راهنمایی کنید مشکل کجاست ممنون

SQLSTATE[HY000]: General error: 1364 Field 'course_id' doesn't have a default value (SQL: insert into `episodes` (`name`, `file`, `user_id`, `updated_at`, `created_at`) values (ویدئو, http://localhost:8000/files/html1.mp4, 1, 2022-02-20 23:43:29, 2022-02-20 23:43:29))

کنترلر

   public function store(Request $request)
    {

        $validData = $request->validate([
            'name' => 'required',
            'file' => 'required',
            'status' => ''
        ]);

        if($request->hasFile('file'))
        {
            $file = $request->file('file');
            $ext = $file->getClientOriginalName();
            $file_name = auth()->user()->id . '_' . time() . '.' . $ext;
            $file->storeAs('/', $file_name, 'files');

            $data['file'] = $file_name;
        }
        $file = auth()->user()->episodes()->create($request->all());

        alert()->success('فایل مورد نظر با موفقیت ثبت شد' , 'با تشکر');
        return redirect(route('episodes.index'));
    }

مدل course


    public function episodes()
    {
        return $this->hasMany(Episode::class);
    }

مدل episode

    public function courses()
    {
       return $this->belongsTo(Course::class);
    }

تو filable1 هم course_id قرار دادم ولی کلا نمیشاسه

دیتابیس

        Schema::create('episodes', function (Blueprint $table) {
            $table->id();

            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

            $table->unsignedBigInteger('course_id');
            $table->foreign('course_id')->references('id')->on('courses')->onDelete('cascade');

            $table->string('name');
            $table->string('file');
            $table->timestamps();
        });

ثبت پرسش جدید
احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
1

@codeLover
بله دقیقا، باید یک دوره ایی رو استاد انتخاب بکنه که شما بدونید برای کدوم دوره میخواد فیلم هارو آپلود بکنه. اینطوری شما مقدار course_id رو هم دارید و میتونید اون رو داخل جدول episodes قرار بدید.


karakar
تخصص : برنامه نویس
@karyabi1395 2 سال پیش مطرح شد
1

این خطا میگه course_id در دیتابیس اطلاعاتی نداره و چون این ستون نباید نول باشه این خطا رو بر میگردونه


Paradox
تخصص : در حال یادگیری
@paradox 2 سال پیش مطرح شد
0

تو دیتابیس باید nullable قرار بدم course_id رو ؟


karakar
تخصص : برنامه نویس
@karyabi1395 2 سال پیش آپدیت شد
1

اگر نیازی نیست که حتما نول نباشه، بله


احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
1

سلام
بنده فکر میکنم شما میخواین یه همچین کاری بکنید.
مثلا یه سایت دارید مثل راکت که میخواید ویدیو های آموزشی قرار بدید، 2 تا جدول هم دارید به نام های دوره (course) و قسمت ها (episodes) یعنی یک دوره ایی مثل دوره آموزش برنامه نویسی سی شارپ توی سایت ثبت میشه و استاد شروع به آپلود محتوای آموزشی میکنه.
کاری که انجام دادید درسته اما یه جاش مورد داره، شما دارید اطلاعات رو ثبت میکنید در جدول قسمت ها (episodes) اما آیدی دوره رو بهش ندادید و این خطا کاملا طبیعیه، و اینکه حتما باید مقدار course_id پر باشه (نباید اصلا خالی باشه). شما باید بدونید که این ویدیو آپلود شده برای کدوم دوره هست که بتونید اون رو به کاربران سایتتون نشون بدید.
پس کاری باید انجام بدید اینکه :
بر اساس اینکه استاد/کاربر_وبسایت میخواد برای دوره ایی ویدیو یی قرار بده باید اول ID اون دوره رو از جدول course ها بگیرید و اون رو موقعه ثبت محتوای های آموزشی در جدول قسمت ها (episodes) قرار بدید.


Paradox
تخصص : در حال یادگیری
@paradox 2 سال پیش مطرح شد
0

@ehsndvr
بله دقیقا همینکارو انجام بدم
یعنی توی مدل و کنترلر course_id باید قرار بگیره
و همینطور موقع ثبت دوره باید فیلد انتخاب دوره باشه که انتخابش کنم درسته ؟


احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
1

@codeLover
بله دقیقا، باید یک دوره ایی رو استاد انتخاب بکنه که شما بدونید برای کدوم دوره میخواد فیلم هارو آپلود بکنه. اینطوری شما مقدار course_id رو هم دارید و میتونید اون رو داخل جدول episodes قرار بدید.


Paradox
تخصص : در حال یادگیری
@paradox 2 سال پیش آپدیت شد
0

@ehsndvr
یسوال دیگه داشتم تو فرانت برای اینکه این لینک هارو زیر دوره مربوطه نمایش بدم نیاز به سرویس پروایدر هست ؟
من به این شکل خواستم نمایش بدم موفق نشدم و نمیدونم درسته یا نه
یه ارور دارم مسیر کنترلر هم یوز شده هست

Invalid route action: [App\Http\Controllers\frontend\EpisodeController].
Route::get('episode/{episode}', FrontendEpisodeController::class , 'Download')->name('download.file');
    public function Download()
    {
       $episodes = Episode::whereStatus(1)->latest()->get();
       return view('courses.courses' , compact('episodes'));
    }
                <ul class="list-group">
                    @foreach($episodes as $episode)
                        <li class="list-group-item">
                           <a href="{{ route('download.file', $episode->id) }}"> {{ $episode->name }} </a>                          
                        </li>
                    @endforeach
                </ul>

احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
0

سلام
بنده فکر نمیکنم نیاز به سرویس پروایدر باشه.
شما باید از URL Parameters استفاده کنید.
[ توضیحات اضافه ]
الان شما میخواین لینک دانلود فایل های هر دوره رو زیر خودش نمایش بدین،موقع چینش صفحه (یعنی وقتی تازه صفحه توسط کاربر صدا زده شده و میخواد لود بشه) باید اطلاعات رو توی صفحه بچینید، حالا چنتا راه کار داره، مثلا الان همین صفحه ایی که ما توش متنی صحبت میکنیم، یک آیدی داره:

#subject-76270

URL این صفحه رو نگاه کنید Subject رو میبینید، حالا شما هم میتونید همچین ایده ایی بزنید برای گذاشتن لینک های دانلود دوره، یعنی وقتی کاربر روی یک دوره کلیک کرد، کاربر رو به صفحه مورد نظر ببرینش اما با این قائده:

https://my-web.com/course?id=123

حالا شما آیدی دوره رو دارید، پس هرموقع بخواین لینک های دوره رو نمایش بدین از همین آیدی دوره استفاده میکنید، و لینک های دانلود رو از جدول Episode بر میدارین.
یعنی یه دستور SQL خیلی ساده:

where course_id = 123

Paradox
تخصص : در حال یادگیری
@paradox 2 سال پیش آپدیت شد
0

@ehsndvr
سلام یعنی این قسمت که کاربر روی مشاهده دوره میزنه رو ایدی براش در نظر بگیرم ؟

  <a class="btn-class mb-2" href="/courses/{{ $course->slug }}">
                            <i class="fa fa-flip-horizontal fa-graduation-cap"></i>
                                مشاهده دوره
                            </a>

این قسمت که میخام زیر دوره ها لینک نمایش داده بشه به این شکل نوشتم ولی چیزی نشون نمیده


                @if($course->episodes)
                    @foreach( $course->episodes as $episode)
                    <li class="list-group-item">
                        <a href="{{ route('download.file', $episode->id) }}"> {{ $episode->name }} </a>                          
                    </li>
                    @endforeach
               @endif

روت

Route::get('courses/{course}/episodes', [FrontendEpisodeController::class , 'download'])->name('download.file');

کنترلر

    public function download(Course $course)
    {
       $episodes = $course()->width('episodes')->paginate(12);
       return view('courses.courses' , compact('episodes'));
    }

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


احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
0

سلام، لطف کنید تلگرام پیام بدید با هم صحبت کنیم
آیدی : ehsndvr@


احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
0

برای سوال دومتون :
کنترلر :

public function download(Course $course)
    {
       $episodes = $course()->with('episodes')->paginate(12);
       return view('courses.courses' , compact('episodes'));
    }

و مدل Course شما میشه :

public function episodes()
    {
        return $this->hasMany(Episode::class)->orderBy('id');
    }

موفق باشید.


Paradox
تخصص : در حال یادگیری
@paradox 2 سال پیش مطرح شد
0
احسان داوری
تخصص : برنامه نویس
@ehsndvr 2 سال پیش مطرح شد
0

@codeLover
خواهش میکنم 🌹


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

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