Вам нужно вернуться к учебнику и учиться понимать, что происходит в вашем коде, а не бездумно переставлять буковки, в надежде, что что-то получится.
Как я делаю, но ничего не получается.
foreach($roles as $cat => $role) {
$categories = Category::with('roles')->find($cat);
$data[] = $role;
}
$categories->roles()->sync($data);
Почему вы переменную называете
$categories
, хотя она содержит ровно одну категорию, найденную по ID?
Зачем вы подгружаете роли категории?
Почему вы переменную называете
$role
, хотя она содержит массив ролей, которые вы выше дампнули?
Почему вы с переменной
$categories
работаете вне цикла, в котором она создаётся?
foreach($request->category as $categoryId => $roles) {
Category::find($categoryId)->roles()->sync($roles);
}