В моем случае заморачиваться сильно не нужно, поэтому решил в качестве решения написать в основной модели
Product функцию
sync()
public function sync(string $relation, array $id) {
$current_ids = $this->$relation()->allRelatedIds()->toArray();
$new_ids = array_filter(array_pluck($id, 'id'));
$this->$relation()->detach(array_diff($current_ids, $new_ids));
$this->$relation()->attach(array_diff($new_ids, $current_ids));
}
И в контроллере при обновлении информации, передаю отношения и их данные.
$product->sync('attributes', $request->get('attributes'));
$product->sync('categories', $request->get('categories'));
$product->sync('promotions', $request->get('promotions'));
В $request у связей мне приходят все столбцы, поэтому мне нужно получить только
id.