使用Laravel 5.4从数据库中删除数据

时间:2017-06-26 10:14:56

标签: php laravel laravel-5 laravel-5.4

我是Laravel框架的新手,我正在构建一个简单的博客。我可以创建博客,显示博客并显示所有博客的概述。现在我想删除一个博客。因此,我在视图中创建了一个删除按钮,其中包含一个路径链接,该链接也会传递文章的ID。然后,在我的路径文件中,我指定了删除请求和控制器方法。在方法中,我找到了id,并尝试删除路径/视图中指定的id的行。

这不起作用。它不是激活销毁/删除方法,而是显示文章而不是删除它,并激活show方法而不是delete方法。有人可以帮帮我,我错了什么?

View.blade.php

<a href="{{route('nieuws.destroy', ['id' => $blog->id])}}" onclick="return confirm('Weet je dit zeker?')">
  <i class="fa fa-trash"></i>
</a>

路线

Route::group(['middleware' => 'auth'], function () {

    Route::get('/aanvragen', 'aanvragenController@index')->name('aanvragen.index');

    Route::get('/logout' , 'Auth\LoginController@logout')->name('logout');

    Route::get('/nieuws/toevoegen', 'blogController@create')->name('blogs.add');

    Route::post('/nieuws/store', 'blogController@store')->name('nieuws.store');

    Route::delete('/nieuws/{id}', 'blogController@destroy')->name('nieuws.destroy');

});

Route::get('/nieuws', 'blogController@index')->name('blogs.index');

Route::get('/nieuws/{blog}', 'blogController@show')->name('blogs.show');

控制器方法

删除/销毁

public function destroy($id) {

    $blog = Blog::find($id);

    $blog->delete();

    return redirect('/nieuws');

}

显示

public function show(Blog $blog) {

    dd('show');


    return view('blogs.show', compact('blog'));

}

4 个答案:

答案 0 :(得分:2)

delete()路线要求您发布数据。

HTML表单仅支持GET和POST,不支持其他方法,如DELETE,PUT等,这就是为什么Laravel使用_method来欺骗HTML表单不支持的方法。

希望在这些情况下使用GET,因为有人可以通过IM或电子邮件向用户发送网址(http://yoursite.com/blog/delete/1)。用户点击,博客就不见了。

定义您使用资源控制器时的路线,所以:

Route::delete('/nieuws/{id}', 'blogController@destroy')->name('nieuws.destroy');

使用带删除方法的表单:

// apply some inline form styles
<form method="POST" action="{{ route('nieuws.destroy', [$blog->id]) }}">
    {{ csrf_field() }}
    {{ method_field('DELETE') }}
    <button type="submit">Delete</button>
</form>

或者做一些javascript魔术作为他的OP评论中发布的链接SR_。

还有一件事,在你的销毁行动中添加某种验证。现在,当您提供不存在的ID或其他内容时,您将收到500错误,而您希望获得404错误。

public function destroy($id)
{
    $blog = Blog::findOrFail($id);

    $blog->delete();

    return redirect('/nieuws');
}

答案 1 :(得分:0)

我认为您需要更新您的销毁功能,如:

public function destroy($id) {

    $blog = DB::table('blog')->where('id',$id)->delete();

    return redirect('/nieuws');

}

并更新您的观看代码,如:

<a href="{{route('nieuws.destroy', [$blog->id])}}" onclick="return confirm('Weet je dit zeker?')">
  <i class="fa fa-trash"></i>
</a>

希望这对你有用!

答案 2 :(得分:0)

我也是Laravel的新手,但我通过这种方式让它成功: (我使用&#39;文章&#39;作为模型的名称和resource&#34;方法&#34;在路线中代表一堆有用的路线,包括你写的路线)

控制器:

public function destroy($id){
        Article::find($id)->delete();
        //$article = Article::find($id);
        return redirect()->back()->withErrors('Successfully deleted!');
    }

路线:

Route::resource('article','ArticleController');

但是,我认为问题在于数据库名称的默认定义。 Laravel将假设您有一个名为blogs的数据库,因为您有一个名为&#34; blog&#34;的模型。你有这个数据库的名字吗?

答案 3 :(得分:0)

要使用DELETE HTTP动词,您的表单应包含POST方法并设置method_field('DELETE')

示例:

<form method="POST" action="{{ route('xxx.destroy', $xxx->id) }}">
    {{ csrf_field }}
    {{ method_field('DELETE') }}
</form>