راکت
حل شده

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

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();
        });
Paradox
Paradox
@paradox
ثبت پرسش جدید

پاسخ‌ها

13
احسان داوری
احسان داوری
@ehsndvr

تخصص: برنامه نویس

بهترین پاسخ

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

karakar
karakar
@karyabi1395

تخصص: برنامه نویس

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

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

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

شاید پاسخ شما همین‌جا باشد

karakar
karakar
@karyabi1395

تخصص: برنامه نویس

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

احسان داوری
احسان داوری
@ehsndvr

تخصص: برنامه نویس

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

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

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

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@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="https://roocket.ir/{{ route('download.file', $episode->id) }}"> {{ $episode->name }} </a>                          
                        </li>
                    @endforeach
                </ul>
احسان داوری
احسان داوری
@ehsndvr

تخصص: برنامه نویس

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

#subject-76270

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

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

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

where course_id = 123
Paradox
Paradox
@paradox

تخصص: در حال یادگیری

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

  <a class="btn-class mb-2" href="https://roocket.ir/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="https://roocket.ir/{{ 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

تخصص: برنامه نویس

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

احسان داوری
احسان داوری
@ehsndvr

تخصص: برنامه نویس

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

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
@paradox

تخصص: در حال یادگیری

@ehsndvr
ممنونم 🌷

احسان داوری
احسان داوری
@ehsndvr

تخصص: برنامه نویس

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

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

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