Удалить строку из таблицы базы данных с помощью 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