راکت
حل
7 پاسخ

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

سلام
من در مورد این مشکل چند جا رو از جمله سایت راکت رو دیدم. منتها جوابهایی که بوده مشکل بنده رو حل نمی کرده. برای همین یه تاپیک جدید زدم.
من اطلاعاتم از جمله یک تصویر رو از یک فرم ساده دریافت می کنم و توسط 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'=>"اطلاعات  دبیر با موفقیت درج شد"]);
        };

ثبت پرسش جدید
حسین شیری نژاد
حسین شیری نژاد
تخصص :programmer
@hosseinshirinegad984 سال پیشمطرح شد
2
    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.niakan19934 سال پیشمطرح شد
1

@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 قرار دهید


حسین شیری نژاد
حسین شیری نژاد
تخصص :programmer
@hosseinshirinegad984 سال پیشمطرح شد
1

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


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

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

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

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

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

موفق باشید


حسین شیری نژاد
حسین شیری نژاد
تخصص :programmer
@hosseinshirinegad984 سال پیشمطرح شد
2
    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'=>"اطلاعات  دبیر با موفقیت درج شد"]);

    }

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

@SobhanDadkhah

سلام

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


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

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

$data = $request->all();

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

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


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

@SobhanDadkhah

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

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


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

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