web-dev-qa-db-ja.com

Laravel 5.4でデータベースからデータを削除します

私はLaravelフレームワークに慣れていないので、単純なブログを作成しています。ブログを作成したり、ブログを表示したり、すべてのブログの概要を表示したりできます。削除したいと思います。ブログ。そこで、記事のIDも渡すルートリンクを使用してビューに削除ボタンを作成しました。次に、ルートファイルで削除リクエストとコントローラーメソッドを指定します。メソッドで、 idを入力し、ルート/ビューで指定したIDの行を削除してみてください。

これは機能しません。 destroy/deleteメソッドをアクティブ化する代わりに、記事を削除する代わりに表示し、deleteメソッドの代わりにshowメソッドをアクティブ化します。誰かが私を助けることができます、私は何が間違っていますか?

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'));

}
3
Gijsberts

delete()ルートでは、データをPOSTする必要があります。

HTMLフォームはGETとPOSTのみをサポートし、DELETE、PUTなどの他のメソッドはサポートされていません。そのため、Laravelは_methodを使用してHTMLフォームでサポートされていないメソッドをスプーフィングします。

あなたこれらの場合にGETを使用したくないのです。誰かがユーザーにURLを送信できるからです( http://yoursite.com/blog/delete/1 )IMまたは電子メール経由。ユーザーがクリックすると、ブログは消えます。

リソースコントローラーを使用する場合と同じようにルートを定義します。

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

また、deleteメソッドを使用してフォームを使用します。

// 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>

または、リンクSR_がOPへのコメントに投稿したようにJavaScriptの魔法を実行します。


もう1つ、破棄アクションに何らかの検証を追加します。現在、存在しないIDなどを指定すると、500エラーが発生しますが、代わりに404が必要です。

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

    $blog->delete();

    return redirect('/nieuws');
}
3
Robert

次のようにdestroy関数を更新する必要があると思います。

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>

この仕事があなたのためになることを願っています!

Laravelも初めてですが、次のように機能させました:(モデルの名前として「Article」を使用し、ルートスタンドでresource「メソッド」を使用しますあなたが書いたルートを含むたくさんの便利なルートのために)

コントローラ:

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

ルート:

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

ただし、問題はデータベースのモデル名のデフォルト定義にあると思います。 Laravelは、「blog」という名前のモデルがあるため、blogsという名前のデータベースがあると想定します。データベースの名前は正しいですか?

0
Tan Yuanhong

DELETE HTTP動詞を使用するには、フォームがPOSTメソッドと設定method_field('DELETE')で構成されている必要があります。

例:

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