Это неправильное понимание Коллекций и Отношений.
В Laravel, если у вас есть продукты отношения в вашем случае, чтобы получить доступ к отношению, которое вы вызовете.
$quote->products(); // returns belongsToMany relation query
Кому доступ к коллекции вы получаете доступ к ней как к свойству.
$quote->products; // returns a collection with the products
В вашем случае вы получаете доступ к ней как к коллекции. Если вы получаете нулевую ошибку, что-то еще может быть неправильным, но начните с изменения ее на следующее.
Во-вторых, чтобы установить сводные поля, используйте массив значений ключа при вызове syn c, используя ключ и ценность вашей структуры. Вероятно, вам также следует отключить токен. Вместо этого я фильтрую его, используя except. Лучшим подходом является использование проверенного в запросе формы.
Вам нужно будет настроить ваши данные, чтобы они соответствовали ожидаемой структуре значения ключа при вызове syn c, syn c также следует называть только одним поскольку он синхронизирует данные между каждым вызовом.
$data = $request->toArray();
$quote = Quote::findOrFail($data['quote_id']); // calling query() is unnecessary
$products = collect($request->except(['_token', 'quote_id']))->
->mapWithKeys(function($item, $key) {
return [$key => ['qty' => $item]];
})->all();
$quote->products()->sync($products);
В этом решении используется mapWithKeys, который позволяет вам управлять ключом и элементом в коллекции, а этот метод сбора используется не так часто. Возврат закрытия должен быть в формате return ['key' => 'item'];
вместо return 'item';
.