如何使用Laravel中的控制器将数据更新到数据库 - 错误非静态方法

时间:2018-04-26 20:37:30

标签: php database laravel

所以我试图使用控制器将编辑后的数据提交回数据库,但我收到错误"非静态方法Illuminate \ Database \ Eloquent \ Model :: update()不应该静态调用" 我认为需要更改更新功能中的代码。

web.php文件

Route::post('/my-updated-routes', 'MyroutesController@update');

控制器

public function update(Request $request)
{
    Myroutes::update([ //updateing to myroutes table
        'start' => $request->start,
        'end' => $request->end,
        'waypoints' => implode(",", $request->waypoints)
    ]);
    return redirect('/my-saved-routes');
}

show.blade.php

<form method="post" action="{{ url('/my-updated-routes') }}">
    {{ csrf_field() }}
    <div class="form-group">
        <label>Start Point</label>
        <input type="text" id="start" name="start" class="form-control" value="{{ $myroute->start }}" required/>
    </div>

    <div class="form-group">
        <label>End Point</label>
        <input type="text" id="end" name="end" class="form-control" value="{{ $myroute->end }}" required/>
    </div>

    <div>
    <label for="mode">Mode of Travel</label>
        <select id="mode" class="form-control" onchange="calculateAndDisplayRoute();">
          <option value="DRIVING" name="driving">Driving</option>
          <option value="WALKING" name="walking">Walking</option>
          <option value="BICYCLING" name="cycling">Cycling</option>
          <option value="TRANSIT" name="public-transport">Public Transport</option>
        </select>
    </div>

    <p>Note: Public Transport is only available for start and end points.</p>


    <div id="dynamicInput" class="form-group">
        <label>Additional Destinations</label>
        <input type="text" name="waypoints" class="form-control" autocomplete="on" value="{{ $myroute->waypoints }}">
    </div>

    <input type="button" class="btn btn-secondary" value="+" onClick="addInput('dynamicInput');" style="padding:0 10px;">               
    </br></br>
    <input type="button" id="calc-route" style="color:#2b2b2b" class="btn btn-light" value="Calculate Route"/>

    <input type="submit" id="update-route" class="btn btn-success" value="Update"/>
    <input type="button" class="btn btn-danger" value="Delete"/>

</form> <!-- end of form -->    

2 个答案:

答案 0 :(得分:0)

您无法直接(静态)调用模型上的::update(..)方法。您必须使用某种查询方法来限定它。例如,Myroutes::where(some_column, someValue)->update(...)将起作用。

我不确定为什么会这样,但我认为这是一种防止人们错误地更新表中所有内容的方法。

但是,如果您确实希望更新表格中的所有行,则可以执行简单的操作,例如Myroutes::where(true, true)->update(...)

答案 1 :(得分:0)

问题是你究竟想在控制器中更新什么?

更新方法是非静态方法你不能用(::)“pamayim nikodatiyim”调用它。这意味着您必须从数据库中获取要更新的行,然后调用更新方法。

要做到这一点,你有两种方式:

通过laravel模型绑定,您可以在这里阅读文档: https://laravel.com/docs/5.6/routing#route-parameters

或者您只需发送要更新的行的ID,检索数据然后调用更新方法:

$data = YourModelName::whereId($request['row_id'])->first();

$data->update([ //updateing to myroutes table
        'start' => $request->start,
        'end' => $request->end,
        'waypoints' => implode(",", $request->waypoints)
        ]); 

如果不指定要更新的行,则无法更新。它没有任何意义。