#laravel #message #laravel-blade
#laravel #Сообщение #laravel-blade
Вопрос:
У меня есть функция в вызываемой функции контроллера, destroy_multiple
которая удаляет определенный элемент базы данных с определенными условиями, например, если этот элемент имеет статус PUBLICADO, он не может быть удален.
При выполнении этого условия должно отображаться конкретное сообщение, но вместо этого появляется эта страница с ошибкой SQLSTATE[23000]
Это код моего представления
@if (session()->has('status'))
<div class=" alert alert-warning" role="alert">
<p>{{ session('status') }}</p>
</div>
@endif
Мой контроллер
public function destroy_multiple(Request $request)
{
$eliminados=0;
$enuso=0;
$Status=Status::where('descripcion','Publicado')->first();
//dd($request->codigos);
//validar los datos
$rules = [
'cursos' => 'required'
];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return Redirect::back()->withErrors($validator)->withInput($request->all());
}
foreach ($request->cursos as $curso){
$cursodb = Cursos::find($curso);
if($cursodb->status_id != $Status->id){
$cursodb->delete();
$eliminados =1;
}
else{
$enuso =1;
}
}
$texto='';
if($eliminados>0){
$texto = 'Se eliminaron '.$eliminados.' cursos con éxito';
//Session::flash('status', 'Se eliminaron '.$eliminados.' códigos, sin embargo '.$enuso.' códigos no se eliminaron porque estan es uso');
}
else{
$texto='No se eliminaron los cursos';
}
if($enuso > 0){
$texto .=', '.$enuso.' cursos no se puede eliminar porque tienen un estatus de Publicado';
}
Session::flash('status', $texto);
return redirect('cursos');
}
Комментарии:
1. Сбой в строке $ cursodb-> delete(), потому что проверка внешнего ключа означает, что в базе данных есть что-то, ссылающееся на $ cursodb-> id, поэтому вы не можете это удалить.
2. Да, я знаю, но я хочу знать, почему, вместо того, чтобы показывать конкретное сообщение о том, что оно там, оно показывает мне эту ошибку!
Ответ №1:
Это ваша схема базы данных, в которой вы устанавливаете ограничение внешнего ключа между двумя таблицами «cursos» и этой другой таблицей, используя внешний ключ «curso_id», и при удалении вы не указали схеме ничего делать, таким образом, вы нарушаете ограничение вашего ключа, поэтому вы просто должны указать ей каскадировать или ничего не делать при удалении в вашем файле миграции:-
Schema::create('other_table', function (Blueprint $table) {
// Some other fields...
$table->integer('curso_id')->unsigned();
$table->foreign('curso_id')->references('id')->on('cursos')->onDelete('cascade');
});
и это будет работать просто отлично.
или просто удалите ограничение внешнего ключа и сделайте это в своих файлах моделей, но обратите внимание, что при удалении вам придется делать это вручную:
DB::table('other_table')->where('curso_id', $curso->id )->delete();
Но ограничение лучше, чем делать это вручную, но вы должны сделать это правильно.
Как здесь внешние ключи, но в последний раз, когда они говорили об этом, была версия 5.0 по какой-то причине, которую я не знаю.
Комментарии:
1. Итак, если я правильно понял, причина, по которой отображается эта ошибка, заключается в том, что я не учел ключевое ограничение!
2. да, и это должно работать нормально, но вам нужно обновить свои миграции, попробуйте это