Вы можете просто определить свои отношения в своих моделях и забыть о настройке внешних ключей и т. Д.
https://laravel.com/docs/5.8/eloquent-relationships
Таким образом, в ваших моделях ChatterDiscussion / ChatterPost (которые вам, возможно, придется создать) у вас будет такая функция:
public function chatter_category()
{
return $this->hasOne('App\ChatterCategory');
}
И в вашей ChatterCategory (которую вам также может понадобиться создать) вы получите обратное:
public function chatter_discussion()
{
return $this->belongsTo('App\ChatterDiscussion');
}
public function chatter_post()
{
return $this->belongsTo('App\ChatterPost');
}
Затем вы можете обработать удаление в каждой из функций удаления в ваших моделях.
В любом случае, ваша ошибка в том, что вы создаете одно и то же имя столбца дважды. Как-то так должно работать (я не проверял это)
Schema::table('chatter_discussion', function (Blueprint $table) {
$table->foreign('chatter_category_id')->unsigned()->index()->references('id')->on('chatter_categories')
->onDelete('cascade')
->onUpdate('cascade');
$table->foreign('user_id')->references('id')->on('users')
->onDelete('cascade')
->onUpdate('cascade');
});
Schema::table('chatter_post', function (Blueprint $table) {
$table->foreign('chatter_discussion_id')->unsigned()->index()->references('id')->on('chatter_discussion')
->onDelete('cascade')
->onUpdate('cascade');
$table->foreign('user_id')->references('id')->on('users')
->onDelete('cascade')
->onUpdate('cascade');
});