سلام دوستان من برای اپلود فایل از روش زیر استفاده کردم
و این ارور نمایش میده
لطفا راهنمایی کنید مشکل کجاست ممنون
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();
});
@codeLover
بله دقیقا، باید یک دوره ایی رو استاد انتخاب بکنه که شما بدونید برای کدوم دوره میخواد فیلم هارو آپلود بکنه. اینطوری شما مقدار course_id رو هم دارید و میتونید اون رو داخل جدول episodes قرار بدید.
این خطا میگه course_id در دیتابیس اطلاعاتی نداره و چون این ستون نباید نول باشه این خطا رو بر میگردونه
سلام
بنده فکر میکنم شما میخواین یه همچین کاری بکنید.
مثلا یه سایت دارید مثل راکت که میخواید ویدیو های آموزشی قرار بدید، 2 تا جدول هم دارید به نام های دوره (course) و قسمت ها (episodes) یعنی یک دوره ایی مثل دوره آموزش برنامه نویسی سی شارپ توی سایت ثبت میشه و استاد شروع به آپلود محتوای آموزشی میکنه.
کاری که انجام دادید درسته اما یه جاش مورد داره، شما دارید اطلاعات رو ثبت میکنید در جدول قسمت ها (episodes) اما آیدی دوره رو بهش ندادید و این خطا کاملا طبیعیه، و اینکه حتما باید مقدار course_id پر باشه (نباید اصلا خالی باشه). شما باید بدونید که این ویدیو آپلود شده برای کدوم دوره هست که بتونید اون رو به کاربران سایتتون نشون بدید.
پس کاری باید انجام بدید اینکه :
بر اساس اینکه استاد/کاربر_وبسایت میخواد برای دوره ایی ویدیو یی قرار بده باید اول ID اون دوره رو از جدول course ها بگیرید و اون رو موقعه ثبت محتوای های آموزشی در جدول قسمت ها (episodes) قرار بدید.
@ehsndvr
بله دقیقا همینکارو انجام بدم
یعنی توی مدل و کنترلر course_id باید قرار بگیره
و همینطور موقع ثبت دوره باید فیلد انتخاب دوره باشه که انتخابش کنم درسته ؟
@codeLover
بله دقیقا، باید یک دوره ایی رو استاد انتخاب بکنه که شما بدونید برای کدوم دوره میخواد فیلم هارو آپلود بکنه. اینطوری شما مقدار course_id رو هم دارید و میتونید اون رو داخل جدول episodes قرار بدید.
@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>
سلام
بنده فکر نمیکنم نیاز به سرویس پروایدر باشه.
شما باید از URL Parameters استفاده کنید.
[ توضیحات اضافه ]
الان شما میخواین لینک دانلود فایل های هر دوره رو زیر خودش نمایش بدین،موقع چینش صفحه (یعنی وقتی تازه صفحه توسط کاربر صدا زده شده و میخواد لود بشه) باید اطلاعات رو توی صفحه بچینید، حالا چنتا راه کار داره، مثلا الان همین صفحه ایی که ما توش متنی صحبت میکنیم، یک آیدی داره:
#subject-76270
URL این صفحه رو نگاه کنید Subject رو میبینید، حالا شما هم میتونید همچین ایده ایی بزنید برای گذاشتن لینک های دانلود دوره، یعنی وقتی کاربر روی یک دوره کلیک کرد، کاربر رو به صفحه مورد نظر ببرینش اما با این قائده:
https://my-web.com/course?id=123
حالا شما آیدی دوره رو دارید، پس هرموقع بخواین لینک های دوره رو نمایش بدین از همین آیدی دوره استفاده میکنید، و لینک های دانلود رو از جدول Episode بر میدارین.
یعنی یه دستور SQL خیلی ساده:
where course_id = 123
@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'));
}
من میخام مثل راکت اول زیر هر دوره اپیزودها نمایش بده
که نشون نمیده
برای سوال دومتون :
کنترلر :
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');
}
موفق باشید.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟