首页 > 解决方案 > Laravel 保存多部分表单

问题描述

我有一个由 3 部分组成的表单,我希望能够在每次提交后更新数据库。有一张表包含以下所有字段。

form1 asks for first and last name
form2 asks for email and phone
form3 asks for city and state

在我的控制器中,我有 3 个单独的函数来保存表单的每个步骤:

public function name(Request $request){
    $lead = Lead::firstOrNew(123);
    $lead->firstName = $request->get('firstName ');
    $lead->lastName = $request->get('lastName');
    $lead->save();
    return redirect('/form2');
}

public function info(Request $request){
    $lead = Lead::find(123);
    $lead->email = $request->get('email');
    $lead->phone = $request->get('phone');
    $lead->save();
    return redirect('/form3');
}

public function address(Request $request){
    $lead = Lead::find(123);
    $lead->city = $request->get('city');
    $lead->state = $request->get('state');
    $lead->save();
    return redirect('/done');
}

有没有办法将它与一个更新功能结合起来?

标签: phpdatabaselaravelformseloquent

解决方案


鉴于 HTTP 请求是无状态的(这意味着每个请求对之前和之后的请求一无所知),我宁愿您使用会话,这样您就可以像redirect从一个form请求到另一个请求一样存储信息。在这种情况下,您的代码应如下所示:

<?php

public function name(Request $request){
    Session::put('nameData', $request->all());   //Store the info from form1 in session and redirect to form2
    return redirect('/form2');
}

public function info(Request $request){
    $validSessionData = Session::has('nameData');

    if (!$validSessionData) {    //Check if the user filled form1, if not, go back to form1
        return redirect('/form1');
    }

    $nameAndInfo = Session::pull('nameData', []) + $request->all();  //Merge the info from form1 with info from form2. You could decide to keep them separate and merge later.

    Session::put('nameAndInfo', $nameAndInfo);
    return redirect('/form3');
}

public function address(Request $request){
    $validSessionData = Session::has('nameAndInfo');

    if (!$validSessionData) {   Another check. You could also extend this by checking for form2 session data
        return redirect('/form1');
    }

    $allData = Session::pull('nameAndInfo', []) + $request->all();  //Merge all session data
    $lead = Lead::firstOrNew(123);
    $lead->firstName = $allData['firstName'];
    $lead->lastName = $allData['lastName'];
    $lead->email = $allData['email'];
    $lead->phone = $allData['phone'];
    $lead->city = $allData['city'];
    $lead->state = $allData['state'];

    $lead->save();
    return redirect('/done');
}

推荐阅读