сделал, как и предполагал -
вначале удаляю все связи с текущим айди,
DB::table('todo_tags_ids')->where('todo_id', '=', $todo->id)->delete();
потом инсертю в чистую таблицу новые связи.
допускаю что динозавры могут этот запрос оптимизировать до одной строки.
к сожалению я пока не динозавр))
UPD:
решилось при помощи метода sync()
Спасибо @iMedved2009