Laravel - Как предотвратить удаление при наличии зависимого поля - PullRequest
0 голосов
/ 07 марта 2020

В моем проекте Laravel -5.8 у меня есть эти модели

HrGradeLevel

class HrGradeLevel extends Model
{
  protected $table = 'hr_grade_levels';

  protected $fillable = [
              'grade_level_code',
              'grade_level_name',
              'description',
          ];

  public function designation(){
    return $this->hasMany('App\Models\Hr\HrDesignation');
  }

  public function employee(){
    return $this->hasMany('App\Models\Hr\HrEmployee');
  }  
}

HrDesignation

class HrDesignation extends Model
{
  protected $table = 'hr_designations';

  protected $fillable = [
              'designation_name',
              'grade_level_id',
          ];

  protected $casts = [];

  public function gradelevel()
  {
      return $this->belongsTo('App\Models\Hr\HrGradeLevel','grade_level_id');
  }
}

HrEmployee

class HrEmployee extends Model
{
  protected $table = 'hr_employees';

  protected $fillable = [
              'first_name',
      'last_name',
              'grade_level_id',
          ];

  protected $casts = [];

  public function gradelevel()
  {
      return $this->belongsTo('App\Models\Hr\HrGradeLevel','grade_level_id');
  }
}

HrDesignation и HrEmployee имеют внешний ключ grade_level_id, который является производным от HrGradeLevel

HrGradeLevelController

public function destroy(Request $request, $id)
{
    $grade = HrGradeLevel::find($id);
    $grade->delete();
    Session::flash('success', 'Grade Level deleted successfully.');
    return redirect()->route('hr.grade_level.index');
}

Из вышеприведенного контроллера, пользователь может удалить строку HrGradeLevel.

* 1018 1025 *, прежде чем пользователю будет разрешено удалить, я хочу, чтобы приложение проверило HrDesignation и HrEmployee, если у любого из них есть данные в grade_level_id, я хочу, чтобы приложение отображало сообщение, и оно не должно разрешать удаление.

Как мне этого добиться?

Спасибо.

1 Ответ

1 голос
/ 07 марта 2020

У вас есть 2 варианта:

  1. Использовать ограничения внешнего ключа для ваших миграций и MySQL предотвратит удаление записи, если внешний ключ используется в других таблицах / записи по умолчанию:

    public function destroy(Request $request, $id)
    {
        $grade = HrGradeLevel::find($id);
    
        try {
            $grade->delete();
        }
        catch (\Illuminate\Database\QueryException $e) {
            if ($e->getCode() == 23000)
            {
                //SQLSTATE[23000]: Integrity constraint violation
                abort('Resource cannot be deleted due to existence of related resources.');
            }
        }
    
        Session::flash('success', 'Grade Level deleted successfully.');
        return redirect()->route('hr.grade_level.index');
    }
    
  2. Проверьте наличие ваших отношений перед удалением:

    public function destroy(Request $request, $id)
    {
        $grade = HrGradeLevel::find($id);
    
        if ($grade->designation()->exists()
            || $grade->employee()->exists())
        {
            abort('Resource cannot be deleted due to existence of related resources.');
        }
    
        $grade->delete();
        Session::flash('success', 'Grade Level deleted successfully.');
        return redirect()->route('hr.grade_level.index');
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...