راکت
حل شده

ذخیره نام فایل ذخیره شده در public در دیتابیس لاراول

7 پاسخ

سلام
من در مورد این مشکل چند جا رو از جمله سایت راکت رو دیدم. منتها جوابهایی که بوده مشکل بنده رو حل نمی کرده. برای همین یه تاپیک جدید زدم.
من اطلاعاتم از جمله یک تصویر رو از یک فرم ساده دریافت می کنم و توسط Teacher::create($request->all()); تو دیتابیس ذخیره می کنم. من می خوام برای انتقال فایل ها به پوشه public از move استفاده کنم. تو این زمینه هم مشکلی نداشتم و فایل رو توی پوشه مخصوصش توی public انتقال می دم. اما توی دیتابیس فیلد pic رو درست ذخیره نمی کنه و آدرس موقت رو ذخیره می کنم.
من می خوام بدونم چطوری می تونم متغیر @request رو از نو مقداردهی کنم و بعد create بزنم. یعنی می خوام بدونم چطوری می تونم متغیر $request رو قبل از اینکه برای ذخیره ارسال کنم ویرایش کنم و مسیری که می سازم رو جایگذاری کنم؟
البته می دونم می تونم یک به یک متغیرها رو با create مقدار دهی کنم اما چون ممکنه تعداد متغیرهام زیاد باشه و مداوم کار مشابه رو انجام خواهم داد نمی خوام یک به یک فیلدها رو مقداردهی کنم و می خوام از all استفاده کنم.
ممنون می شم راهنمایی کنید. تا اینجا هم متد ذخیره م توی کنترلر اینطوریه:

public function store(Request $request)
    {
        $this->validate($request,[
            'file' => 'mimes:jpg,jpeg,png,gif|max:1024'
        ]);
        if ($request->hasFile('pic')){
            $patch = 'images/teacherPic';
            $file = $request->file('pic');
            $uniqueId = uniqid();
            $fileName = $uniqueId."-".$file->getClientOriginalName();
            $file->move(public_path($patch),$fileName);
            $request->get('pic',$patch."/".$fileName);
            $request->input('pic');
        }
        dump($request->all(['pic']));
        $data = Teacher::create($request->all());
        if($data){
            return redirect()->route('teacher.index')->with(['message'=>"اطلاعات  دبیر با موفقیت درج شد"]);
        };
ثبت پرسش جدید

پاسخ‌ها

7
حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

بهترین پاسخ
    public function store(Request $request)
    {
        $this->validate($request,[
            'file' => 'mimes:jpg,jpeg,png,gif|max:1024'
        ]);

        $data = $request->except('pic');

        if ($request->hasFile('pic')) {

            $patch = 'images/teacherPic';

            $file = $request->file('pic');

            $uniqueId = uniqid();

            $fileName = $uniqueId."-".$file->getClientOriginalName();

            $file->move( public_path($patch), $fileName );

            $data['pic'] = $patch. '/' . $fileName; 
        }

        $data = Teacher::create($data);

        return redirect()->route('teacher.index')->with(['message'=>"اطلاعات  دبیر با موفقیت درج شد"]);

    }
Hamid Reza Niakan
Hamid Reza Niakan
@hamid.niakan1993

@rafig.xiyavi

public function store(Request $request)
{
    $this->validate($request, [
        'file' => 'mimes:jpg,jpeg,png,gif|max:1024'
    ]);

    $data = new Teacher(); //  new object form model 
    $data->fill($request);
    $data->save();

    if($request->hasFile('pic')) {
        $file = $request->file('pic');
        $path = $file->store('teacher','public');
        $data->pic = $path;
        $data->save();
    }

    if($data) {
        return redirect()->route('teacher.index')->with(['message'=>"اطلاعات  دبیر با موفقیت درج شد"]);
    }
}

شما باید فیلد pic در migration جدول teacher قرار دهید

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

نیازی نیست ریکوئست رو از نو جایگذاری کنی از یه ارایه استفاده کن
همه مقادیر مورد نظر رو به جا بریز تو ارایه بعد مقدار ادرس عکس رو هم در ادامه تو ارایه ذخیره کن
بعد ارایه رو به متد createبده

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

سبحان دادخواه
سبحان دادخواه
@SobhanDadkhah

تخصص: دانشجوی برنامه نویسی :)

با سلام. روش های متنوعی هست که میتونید کاری که میخواین انجام بدین. ( به عنوان تغییر آرایه ریکوئست در لاراول سرچ بزنید)

یک روش این هست که کل آرایه ریکوئست رو در یک آرایه جدید مثلا Data ذخیره کنید و بعد با کلید آرایه مقدار مورد نظر رو تغییر بدید و سپس آرایه رو به متد Create تحویل بدید:

$data = $request->all();
$data['your-image-key'] = $path;
Model::create($data);

یا اینکه از متد merge روی ریکوئست دریافتی استفاده کنید. که نمونش در سایت لاراکست توضیح داده شده که به نظرم راه خوانا تر و تر و تمیز تری هست :)

موفق باشید

محمود خسروی
محمود خسروی
@oxbir

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

@SobhanDadkhah

سلام

ببخشید اون که نوشتی your-image-key منظورت چیه؟

سبحان دادخواه
سبحان دادخواه
@SobhanDadkhah

تخصص: دانشجوی برنامه نویسی :)

@oxbir
سلام. کلید آرایه هست. بصورت کلی توی لاراول $request یک ابجکت از کلاس Illuminate/http/Request هست . وقتی شما متد all رو روش صدا میزنید کل ریکوئست های ارسال شده به کنترلر رو بصورت آرایه برمیگردونه.

$data = $request->all();

// محتویات آرایه شامل همه پارامتر های موجود در ریکوئست
$data = [
"_csrf" => "asdasdasd"
"name" => "john"
"family" => "doe"
"image/picture/pic/..." => "upladed image"
];

در واقع کلید آرایه همون ویژگی name هست که برای اینپوت ها توی فرم تعریف میشه. یک نفر ممکن هست اسم اینپوت رو image گذاشته باشه یک نفر picture و ... .
اینطوری با دسترسی به هر عنصر از آرایه با کلیدش میتونید مقادیر ریکوئست رو ویرایش کنید.
موفق باشید 😎

محمود خسروی
محمود خسروی
@oxbir

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

@SobhanDadkhah

ممنون از پاسختون

یه مشکلی من دارم در این لینک

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

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