Armin Rahmati
3 سال پیش توسط Armin Rahmati مطرح شد
5 پاسخ

حذف عکس

سلام دوستان.
من واسه هر آگهی که کاربر قرار میده این امکان رو دادم که سه تا عکس هم بتونه واسه آگهیش آپلود کنه و واسه این کار یه جدول دیگه درنظر گرفتم که به جدول اصلی از طریق کلید خارجی به صورت زیر ارتباط داره:

Schema::create('job_galleries', function (Blueprint $table) {
    $table->id();
    $table->foreignId('job_id')->constrained()->onDelete('CASCADE');
    $table->string('image1');
    $table->string('image2');
    $table->string('image3');
    $table->timestamps();
});

حالا با استفاده از کد زیر کاربر اگه بر روی دگمه حذف کلیک کنه هر سه عکس با هم پاک میشه.

<a href="{{ route('jobs.gallery.destroy', ['job' => $job->id, 'gallery' => $image->id]) }}" onclick="destroyGallery(event, {{ $job->id, $image->id }})" class="btn btn-sm btn-danger">حذف</a>
<form action="{{ route('jobs.gallery.destroy', ['job' => $job->id, 'gallery' => $image->id]) }}" method="POST" id="destroy-gallery-{{ $job->id, $image->id }}">
    @csrf
    @method('delete')
</form>
public function destroy(Job $job, $id)
{
    $gallery = JobGallery::find($id);
     if (File::exists(public_path("{$gallery->image1}")) && File::exists(public_path("{$gallery->image2}")) && File::exists(public_path("{$gallery->image3}")))
            File::delete(public_path("{$gallery->image1}"));
            File::delete(public_path("{$gallery->image2}"));
            File::delete(public_path("{$gallery->image3}"));
        $gallery->delete();
        session()->flash('status', 'عکس ها با موفقیت حذف شدند');
        return redirect(route('jobs.gallery.index' , ['job' => $job->id]));
}

حالا اگه بخوام کاربر هر کدوم از این سه تا عکسو که خواست رو حذف کنه باید به چه صورت کدمو بنویسم؟


ثبت پرسش جدید
سعید
تخصص : برنامه نویس
@saeed.amiri7676 3 سال پیش مطرح شد
0

سلام اگر درست متوجه شده باشم
باید برای عکس های یک آیدی مشخص کنی مثلا عکس یک عکس دو عکس سه بعد زمانی که کاربر روی حذف عکس کلیک کرد تو شماره اون عکس رو هم همراه با آیدی job میفرستی و توی شرطی که برای وجود داشتنش گذاشتی میگی که کدوم عکس پاک بشه نه هر سه تای عکس
البته راه های بهتری هم وجود داره اما دیتابیس و ذخیره سازی فایل هات جوری طراحی شده که فکر کنم این راحت ترین راهش باشه


Armin Rahmati
@arminrahmati999 3 سال پیش مطرح شد
0

@saeed.amiri7676
ببینید من سه تا input در نظر گرفتم، که همین کارمو خراب کرده فکر کنم، در واقع من دیتابیسو باید به صورت زیر بنویسم، درسته؟

Schema::create('job_galleries', function (Blueprint $table) {
    $table->id();
    $table->foreignId('job_id')->constrained()->onDelete('CASCADE');
    $table->string('images');
    $table->timestamps();
});

متدهای آپلود 3 عکس به صورت زیر است:

/* Upload Image 1 */
    protected function uploadImage1($images = '') {
        $path = 'upload/images';
        if (request()->hasFile('image1') && $files = request()->file('image1'))
            $images = $files->store($path, 'public_files');
        return $images;
    }

    /* Upload Image 2 */
    protected function uploadImage2($images = '') {
        $path = 'upload/images';
        if (request()->hasFile('image2') && $files = request()->file('image2'))
            $images = $files->store($path, 'public_files');
        return $images;
    }

    /* Upload Image 3 */
    protected function uploadImage3($images = '') {
        $path = 'upload/images';
        if (request()->hasFile('image3') && $files = request()->file('image3'))
            $images = $files->store($path, 'public_files');
        return $images;
    }

کنترلر هم به صورت زیر:

public function store(CreateGalleryRequest $request, Job $job)
    {
        $image1 = $this->uploadImage1();
        $image2 = $this->uploadImage2();
        $image3 = $this->uploadImage3();
        if ($request->hasFile('image1')) {
            $data['image1'] = $image1;
        } else
            $data['image1'] = null;

        if ($request->hasFile('image2')) {
            $data['image2'] = $image2;
        } else
            $data['image2'] = null;

        if ($request->hasFile('image3')) {
            $data['image3'] = $image3;
        } else
            $data['image3'] = null;

        $job->gallery()->create($data);
        session()->flash('status', 'عکس ها با موفقیت ثبت شدند');
        return redirect(route('jobs.gallery.index' , ['job' => $job->id]));
    }

حالا کدمو چه تغییری بدم، تا در هنگام حذف کردن بتونم هر عکسی که خواستمو حذف کنم؟


سعید
تخصص : برنامه نویس
@saeed.amiri7676 3 سال پیش مطرح شد
0

توی همون پیام اول که ارسال کردی دیتابیست به همون صورت بزار باشه فقط موقع حذف عکس آیدی عکس رو برای تابع destroy بفرست و فقط همون عکس رو پاک کن و توی جدول هم مشخص کن و زمانی که میخوای عکس ها رو به کاربر نشون بدی در صورتی که فیلد عکسش خالی هست مثلا دکمه اضافه کردن رو بهش نشون بده که بتونه به همون فیلد عکس جدید اضافه کنه.


Armin Rahmati
@arminrahmati999 3 سال پیش مطرح شد
0

@saeed.amiri7676
خب وقتی عکسی رو ذخیره میکنم به صورت زیر ذخیره میشه، در واقع هر سه عکس یک آیدی دارن.
توضیح تصویر رو وارد کنید


سعید
تخصص : برنامه نویس
@saeed.amiri7676 3 سال پیش مطرح شد
0

مهم نیست مثلا زمانی که میخوای عکس دوم رو حذف کنی با آدرسی که در این دیتابیس داری عکس رو پیدا میکنی و حذفش میکنی بعدش همین جدول رو آپدیت میکنی و Image2 یا مقدارش رو خالی میکنی یا مثلا یه چیزی داخل مینویسی که بدونی این عکس بوده قبلا الان حذف شده که زمانی کاربر بخواد دوباره عکس رو بزاره متوجه میشه که عکس دوم رو باید اضافه کنه


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

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