Удалить строку из таблицы базы данных с помощью Laravel 5.2

Недавно я начал с Laravel 5.2 и пытаюсь создать кнопку удаления, которая удалит строку из базы данных. Очень простой и тривиальный, но, кажется, я не могу это сделать.

У меня есть следующая документация для удаления: https://laravel.com/docs/5.2/queries

И я сделал это. Мой маршрут:

Route::post('flags/destroy/{delete}', 'FlagsController@destroy')->name('admin.flags.destroy');

Кнопка в представлении

{!! Html::linkRoute('admin.flags.destroy', 'Delete', $flag->report_id) !!}

и контроллер

public function destroy(Request $request){

    $report = $request['report_id'];      

    Report::find($report);

    $report->delete();        
    $request->session()->flash('alert-success', ' Report is deleted successfully.');

    return redirect()->route('admin.flags');
}

Я пробовал решения из других тем, но всегда получал ошибку:

MethodNotAllowedHttpException в строке compiled.php 8936:

Новая ошибка:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'reports.id' in 'where clause' (SQL: select * from `reports` where `reports`.`id` is null limit 1

Почему ищет id вместо report_id?

ОБНОВИТЬ:

кнопка

{!! Html::linkRoute('admin.flags.destroy', 'Delete', $flag->report_id) !!}

контроллер

public function destroy(Request $request){

    $report = $request['report_id'];      

    dd( $request->input('delete'));

    Report::where('report_id', $report)->first();

    $report->delete();        
    $request->session()->flash('alert-success', ' Report is deleted successfully.');

    return redirect()->route('admin.flags');
}

маршрут

Route::get('flags/destroy/{delete}', 'FlagsController@destroy')->name('admin.flags.destroy');

Обновление 2: это похоже на работу, но достаточно ли это безопасно? Посмотреть:

 {!! Form::open(array('route' => array('admin.flags.destroy', $flag->report_id), 'method' => 'get')) !!}
        <button type="submit">Delete</button>
 {!! Form::close() !!}</td> 

контроллер

public function destroy($report_id){

  Report::destroy($report_id);
  //$request->session()->flash('alert-success', ' Report is deleted successfully.');

  return redirect()->route('admin.flags');
}

4 ответа

Решение

Я думаю, что ваш код необходимо обновить, как:

public function destroy($delete){

   $report = $delete;      

   $rsltDelRec = Report::find($report);

   $rsltDelRec->delete();        
   $request->session()->flash('alert-success', ' Report is deleted successfully.');

   return redirect()->route('admin.flags');
}

Надеюсь, эта работа для вас!

Попробуй это:

контроллер:

  public function destroy(Report $report){

          $report->delete();

          return redirect()->route('admin.flags');

    }

Вы создаете get ссылка но с использованием post маршрут. Измените это на:

Route::get('flags/destroy/{delete}', 'FlagsController@destroy')->name('admin.flags.destroy');

MethodNotAllowedHttpException означает, что вы пытаетесь получить доступ к маршруту неверным методом. Если вы используете Html::linkRoute тогда якорь генерируется, но в ваших маршрутах вы определили Route::post, Вам нужно заменить Route::post с Route::get, Но если вы хотите сделать его более безопасным, вам нужно создать простую форму с кнопкой удаления и токеном CSRF.

<form method="POST" action="{{ URL::route('admin.flags.destroy', {'delete' => $flag->report_id}) }}">
    {{ csrf_field() }}
    <!-- submit button -->
</form>

Почему ищет идентификатор вместо report_id?

Вам нужно заменить

Report::find($report);

с

$report = Report::where('report_id', $report)->first();

public function destroy(Request $request){

    $report = $request['report_id'];
    ....

Вы пытаетесь здесь получить доступ report_id в запросе, но в маршрутах вы назвали ваш параметр как delete

Другие вопросы по тегам