Сообщения о состоянии не отображаются на моем представлении

#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. да, и это должно работать нормально, но вам нужно обновить свои миграции, попробуйте это