2017-01-31 4 views
2

Я пытаюсь удалить данные в двух связанных таблицах между собой. Поэтому, когда я удалить строку в сайтов стол, я также хочу, чтобы удалить строки в ключевых слов таблицы, которые связаны с внешними ключами

сайтов
ид | siteNameLaravel удалять в двух связанных таблицах за одно и то же время

1 | пример

ключевые слова
ID | website_id | kwName

1 | 1

Поэтому, когда я удаляю веб-сайт, строка с тем же идентификатором (website_id как внешний ключ) не удаляется.

Мой код для удаления является:
Контроллер

public function destroy($id) 
{ 
    $projects = Website::findOrFail($id); 
    $projects->delete(); 

    return redirect()->route('projects.index')->with('alert-success','Data Has been Deleted!'); 
} 

клинка

@foreach($projectss as $projects) 

    <tr> 

     <td>{{$no++}}</td> 
     <td>{{$projects->siteName}}</td> 
     <td>{{$projects->siteUrl}}</td>  


     <td> 
     <form class="" action="{{route('projects.destroy',$projects->id)}}" method="post" enctype="multipart/form-data"> 
      <input type="hidden" name="_method" value="delete"> 
      <input type="hidden" name="_token" value="{{ csrf_token() }}"> 
      <a href="{{route('projects.show',$projects->id)}}" class="btn btn-success">View</a> 
      <a href="{{route('projects.edit',$projects->id)}}" class="btn btn-primary">Edit</a> 
      <input type="submit" class="btn btn-danger" onclick="return confirm('Are you sure to delete this data');" name="name" value="delete"> 
     </form> 
     </td> 
    </tr> 
    @endforeach 

Модель Keyword.php

public function website() { 
    return $this->belongsTo('App\Website'); 
} 

Модель Website.php

public function keywords() { 
    return $this->hasMany('App\Keyword'); 
} 

ответ

2

Один быстрый метод, который вы можете использовать нас, чтобы связать функции boot в вашей Website модели, а затем захватить deleted событие, которое предоставляет вам экземпляр модель, которая удаляется в качестве первого аргумента ($website).

Вот пример:

public static function boot() 
{ 
    parent::boot(); 

    static::deleted(function($website){ 
     $website->keywords()->delete(); 
    }); 
} 
+0

Ошибка: Не удается сделать статический метод Осветите \ Database \ красноречивый \ Model :: пыльник() не статическую в классе App \ Сайт –

+0

@ R.Jonson Я обновил функцию, чтобы быть статическим, перемещаясь слишком быстро. Извиняюсь. – Ohgodwhy

+1

Отлично! Оно работает. Спасибо. Извините за эту ошибку, я также не видел, чтобы функция не была со статикой. Большое спасибо еще раз. –

7

Лучший способ для достижения этой цели является использование onDelete('cascade') при определении внешнего ключа:

$table->foreign('website_id')->references('id')->on('websites')->onDelete('cascade'); 

Так что, когда вы будете удалить веб-сайт, все ключевые слова, связанные он будет удален автоматически.

https://laravel.com/docs/5.4/migrations#foreign-key-constraints

+0

Я хотел бы быть таким. Я попробовал, я написал тот же код в файле create_keywords_table.php, но не работал. Я не знаю почему. –

+0

Я действительно поддержал это и предпочел бы этот метод в отношении ответа, который я предоставил, однако иногда проще привязать метод загрузки для новичков, которые не знакомы с миграциями или как работают ограничения внешнего ключа. Тем не менее, +1, и любой другой, кто ищет этот ответ, должен предпочесть, чтобы их схема выглядела так, чтобы приложение не нуждалось в эмуляции надлежащего дизайна базы данных. – Ohgodwhy

+0

Согласен, но этот метод не работает в моем случае. Я попытался, но это не сработало. Однако я поддержал это. –

Смежные вопросы