如何通过laravel中的控制器将数据保存在数据库中

Posted

技术标签:

【中文标题】如何通过laravel中的控制器将数据保存在数据库中【英文标题】:How to save the data in database via controller in larval 【发布时间】:2021-11-06 16:54:12 【问题描述】:

我不知道错误在哪里,数据没有保存到数据库中。任何人都可以帮助我将其全部使用。我被困在这些天了。提前谢谢你。

我的路线

 Route::get('/reject','RejectionReasonsController@index');
 Route::post('/reject','RejectionReasonsController@store');

我的控制器(RejectionReasonsController)

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class RejectionReasonsController extends Controller

    public function index()

        $record = RejectionReason::all();

        return view('reject');
    

    public function store(Request $request)


        $record= new RejectionReason();

        $record->reason_title = request('reason_title');

        $record->save();

        return redirect('/routes');

    

我的模型文件(拒绝原因)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class RejectionReasons extends Model

    protected $fillable = ['reason_title'];

我的刀片文件(reject.blade.php)

                <div class="form-check">
                    <form action="/store" class="textbox" method="POST">
                        <h5><b> Select Reasons: </b></h5>
                        <input type="checkbox" id="rejectReason1" name='reason_title[]' value='No responce'> No responce <br>
                        <label for="Rejection">
                            <input type="checkbox" id="rejectReason2" name='reason_title[]' value='Skills mismatch'> Skills mismatch
                        </label>
                        <br />
                        <div id="txtReasonRejected1" style="display: none">
                            <input type="text" id="Reasons1" />
                        </div>
                        <input type="checkbox" id="rejectReason3" name='reason_title[]' value='Culture mismatch'> Culture mismatch <br>
                        <input type="checkbox" id="rejectReason4" name='reason_title[]' value='Salary  expectation mismatch'> Salary  expectation mismatch <br>
                        <label for="Rejection">
                            <input type="checkbox" id="rejectReason5" name='reason_title[]' value='Not enough knowledge/inclination for ColoredCow'> Not enough knowledge/inclination for ColoredCow
                        </label>
                        <br />
                        <div id="txtReasonRejected2" style="display: none">
                            <input type="text" id="Reasons2" />
                        </div>
                        <button type="submit">Reject</button>
                    </form>
                </div>

我不知道错误在哪里,数据没有保存到数据库中。任何人都可以帮助我将其全部使用。我被困在这些天了。提前谢谢你。

【问题讨论】:

首先将您的请求数据转储到控制器中,例如 dd($request); 由于您已将复选框的名称属性的值设置为数组 reason_title[],因此 $request->reason_title 的值将是一个字符串数组。如果要将其存储为一条记录,则需要使用 ',' 进行内爆,或者可以通过循环 $request->reason_title 来存储多条记录 除非你设置了另一个路由action="/store" 不会命中那个控制器方法。您的表单中还缺少@csrf 【参考方案1】:

如果您绝对确定表单中只有特定数量的“原因”,那么最好在数据库中为每个原​​因创建一列。即

    class RejectionReasons extends Model
    
     protected $fillable = ['reason_one','reason_two','reason_three' .......];
    

同样在你的 RejectionController 中,你应该在命名空间之后导入你的模型

   <?php

   namespace App\Http\Controllers;
   
   user RejectionReason;
   use Illuminate\Http\Request;

   class RejectionReasonsController extends Controller
     ....... 

是的,您的表单也缺少 @csrf 。

【讨论】:

【参考方案2】:

首先像这样改变你的路线

Route::post('/reject','RejectionReasonsController@store')->name('reject.post');

然后在你的刀片中

<form action="route('reject.post')" class="textbox" method="POST">
    @csrf

【讨论】:

页面由于不活动而过期。请刷新并重试。这是我得到的一个 刷新页面,点击网址或在私密窗口中打开 在表单标签下方添加@csrf csrf_field() 这可以吗?【参考方案3】:

由于您已将复选框的name 属性的值设置为数组reason_title[],因此$request-&gt;reason_title 的值将是一个字符串数组

如果您希望它位于一条记录中,您可以将其存储为逗号分隔值(使用 implode 辅助函数)

public function store(Request $request)


    $record= new RejectionReason();

    $record->reason_title = implode(",", $request->reason_title);

    $record->save();

    return redirect('/routes');


如果您想将每个原因标题存储为新记录,您只需循环它

public function store(Request $request)


    foreach($request->reason_title as $value)
        
        $record= new RejectionReason();

        $record->reason_title = $value;

        $record->save();
    

    return redirect('/routes');

【讨论】:

我应该从刀片文件中删除 reason_title 数组并运行吗? 这取决于您的用例。如果你想要多选,那么你需要将它保存为一个数组,否则它将是一个单一的选择。一次一个原因标题。只需在控制器中使用 dd($request) 打印请求,这将有助于您了解请求和数据流。 它抛出我的模型没有声明我如何解决这个问题 类声明前导入模型use App\Models\RejectionReasons;【参考方案4】:
public function store(Request $request)


    $record= new RejectionReason();
    
    $record->reason_title = $request->reason_title;

    $record->save();

    return redirect('/routes');


你可以试试

如果你有更多的行,你可以运行一个循环

【讨论】:

点击拒绝后它不起作用。我认为表格有一些错误 你可以取一个数组。因此您可以将数据保存在数据库中的多个或逗号分隔符中。喜欢 implode($request->reason_title) 你可以在你的控制器中使用 dd($request->reasion_title) 。那你就明白了。
@csrf
你的表单不正确试试看。跨度>

以上是关于如何通过laravel中的控制器将数据保存在数据库中的主要内容,如果未能解决你的问题,请参考以下文章

如何通过重定向将数据传递到laravel中的视图

如何根据laravel控制器中另一个表中保存的数据创建触发器以填充数据库中的表

不将引导日期值保存到 Laravel 中的数据库表

Laravel如何保存for循环中的数据

表的laravel循环值然后将其保存到数据库

如何将视图中的数组传递给 ajax 并在 Laravel 5 的控制器中访问?