У меня есть таблица «категории» с полями: id, parent_id, name, order. Parent_id - это внешний ключ для идентификатора другой категории. Теперь мой контроллер получает массив из запроса AJAX:
public function saveCategories(Request $request) {
if(!$request->ajax()) return Response::json(['error' => 'Received data has invalid format'], 500);
$data = $request->all()['data'];
return $data;
}
Полученный массив имеет те же поля, что и таблица, поэтому:
id, parent_id, имя и порядок.
Какой самый удобный способ обновить таблицу «категории» с данным массивом? Что нужно иметь в виду:
Элементы с таким же идентификатором, что и в массиве, только что обновились.
Добавляются новые элементы, так что те, которые 'id' еще не найдены в базе данных, должны быть добавлены.
Элементы, которые не найдены, но встречаются в базе данных, должны быть удалены.
Нужно ли проходить через все элементы и изменять базу данных вручную?
E: Некоторые из других таблиц относятся к категориям, поэтому решение удалить каждую строку и создать все записи с нуля не вариант.
E2: Вдохновленный ответом @EduardoJunior, мне удалось сделать следующее:
public function saveCategories(Request $request) {
if(!$request->ajax()) return Response::json(['error' => 'Sent data invalid format'], 500);
$data = $request->all()['data'];
$all_ids = array_map(function($category){
Category::updateOrCreate(['id' => $category['id']], ['name' => $category['name'],
'parent_id' => $category['parent_id'], 'order' => $category['order']]);
return $category['id'];
}, $data);
Category::whereNotIn('id', $all_ids)->delete();
return ['success' => true];
}
Создает и изменяет строки, но только изменяет / добавляет поле имени. Parent_id остается неизменным или получает значение по умолчанию, равное нулю, в новых строках, также как и в поле заказа
Если я удалил одну категорию, так что Category :: whereNotIn () должен быть запущен, сервер выдает ошибку 500.
E3: Конечно, это была проблема с $ fillable, я чувствую себя так глупо. Также удаление работает сейчас. Однако 'parent_id' => $ category ['parent_id'] в updateOrCreate () по-прежнему не работает. Имя и порядок и сохранены правильно, но это поле не.