Laravel:更新单行中的单列?

时间:2019-10-21 21:48:52

标签: laravel

对于学校,我们必须使用laravel制作租船系统。 我对laravel并不陌生,对编程一般来说也很陌生。 在我的YachtsController中,我有一个函数更新,该函数是在edit.blade.php文件中编辑游艇的所有值之后调用的。现在我要做的是,如果我单击“出租”按钮,它将把数据库中的游艇状态从“可用”更新为“不可用”。我该怎么做呢?我必须为此创建一个名为“ rent”的新功能吗?

游艇视图:

{!! Form::open(['action' => ['YachtsController@update', $yacht->id], 'method' => 'POST']) !!}
   {{Form::hidden('_method', 'PUT')}}
   {{Form::submit('Rent',['class' => 'btn btn-primary'])}}
{!! Form::close() !!}

YachtsController:

public function update(Request $request, $id)
    {
        $this->validate($request, [
            'name' => 'required',
            'yachttype-list' => 'required',
            'port-list' => 'required', 
            'status' => 'required',
            'code' => 'required'
        ]);

        $yacht = Yacht::find($id);
        $yacht->name = $request->input('name');
        $yacht->yacht_type_id = $request->input('yachttype-list');
        $yacht->port_id = $request->input('port-list');
        $yacht->status = $request->input('status');
        $yacht->code = $request->input('code');
        $yacht->save();

        return redirect('/yachts')->with('success', 'Yacht updated!');
    }

那么,如果我提交表格将更改状态,该怎么办?

编辑:

所以我现在尝试制作一个名为rent的新功能:

游艇视图:

{!! Form::open(['action' => ['YachtsController@rent', $yacht->id], 'method' => 'POST']) !!}
{{Form::hidden('_method', 'PUT')}}
{{Form::submit('Rent',['class' => 'btn btn-primary'])}}
{!! Form::close() !!}

YachtsController租用功能

    public function rent($id)
    {
        $yacht = Yacht::find($id);
        $yacht->status = "Unavailable";
        $yacht->save();
        return redirect('/yachts')->with('success', 'Yacht rented!');
    }

路线:

Route::get('yachts/rent', 'YachtsController@rent');
Route::resource('yachts', 'YachtsController');

现在,当我单击视图上的“租用”按钮时,似乎它仍在验证我的更新功能中的表单,并给了我这个错误:

Error

2 个答案:

答案 0 :(得分:1)

您从update方法中获得验证错误的原因是Laravel认为您正在尝试通过将航线放置到/yachts/{yacht id}来更新整个游艇。您真正想要的是以特定方式更新特定游艇(出租)。

执行此操作的最佳方法(我认为)是修改您的路由以显式创建您的PUT路由,然后使用该名称在表单上使用:

Route::put('yachts/{id}/rent', 'YachtsController@rent')->name('yacht.rent');
Route::resource('yachts', 'YachtsController');

然后您的表单可以使用新的命名路由:

{!! Form::open(['route' => ['yacht.rent', $yacht->id], 'method' => 'POST']) !!}

应将您的表格输入正确的路线。

答案 1 :(得分:1)

您的游艇/租金方法是get,但您认为您使用put方法。 因此,当您提交表单时,它仍然可以通过put方法转到yacth / {id}(函数更新)。在update函数中,有验证器,因此会给出验证错误。

我的解决方案是创建新的put链接,并且现在可以在其中没有验证器的情况下运行。

您的路线:

Console logs

Am getting this logs on the console

Oct 22, 2019 8:51:29 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Register] in context with path [/registeruser] threw exception [Servlet execution threw an exception] with root cause
java.lang.ClassNotFoundException: org.hibernate.cfg.Configuration
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
    at RegisterDAO.getSessionFactory(RegisterDAO.java:8)
    at RegisterDAO.create(RegisterDAO.java:15)
    at Register.doPost(Register.java:34)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)

在您的控制器中:

    Route::put('yachts/update_rent/{id}', 'YachtsController@update_rent')