saveMany () не хранит данные - PullRequest
0 голосов

Учитывая следующие модели:

Car Model
- parts: hasMany(Parts::class)

Part Model
- car: belongsTo(Car::class)

Запуск

Car::find(1)->parts()->saveMany(Part::hydrate($request->parts));

правильно возвращает список деталей, у 3 есть идентификатор, у одной нет, так что это 3 модели, которые нужно обновить и одну нужно вставить. Однако, глядя на мою базу данных, ни одна строка не вставлена, и выдача dd(Car::find(1)->parts) возвращает пустой массив. createMany работает, но это не обновляет модели с id - вместо этого создаются новые. Из документации ,

Если вам нужно сохранить несколько связанных моделей, вы можете использовать метод saveMany

...

Разница между save и create в том, что save принимает полный экземпляр модели Eloquent, а create принимает простой PHP array

Так в чем причина createMany работает, а saveMany нет?

Ответы [ 2 ]

0 голосов

Это неправильное использование Post::hydrate. Функция hydrate возвращает коллекцию моделей, помеченных так, как будто они поступают из базы данных. Поскольку после увлажнения ничего не меняется, save() игнорируется, потому что в них не вносятся изменения. Кроме того, saveMany() не заботится об указанном id и создает новые объекты без разбора. В конце я перенес валидацию в связанную модель и сделал delete()/createMany() для каждого обновления.

0 голосов
/ 18 июня 2019

Вы сами объяснили это, используя цитату из документации.

saveMany() использует красноречивые модели, это было бы здорово для обновления уже существующих деталей.Он не работает с универсальными массивами, которые, как я полагаю, $request->parts от вашего внешнего интерфейса.

createMany() использует универсальные массивы, поскольку ваш $request->parts (опять же, я предполагаю) является массивом, который он передает.

...