Как все-таки правильно организовать запись множественных характеристик объекта?
Снова возникли сомнения в оптимальности моего подхода.
Использую Laravel 5.2 и MySQL.
Есть реестр объектов.. id, описание..
Но скажем, у каждого объекта может быть чего-либо несколько. Допустим это номера телефонов.
Ок. Банальная телефонная книга. Есть ФИО и неопределенное множество телефонов.
Я создаю две таблицы - fio, phones связанные по id.
Достать все записи и прикрепить связи с помощью with я могу... а как первичная итерация записи в БД осуществляется?
Форма внешне единая... и кнопка добавить в БД должна быть одна...
Правильно ли я понимаю, что программно это должно быть несколько разных форм с разными контроллерами?
Где подсмотреть?
Не нужно много форм.
Достаточно в контроллере вызвать: $user->phones()->create($phone) и все.
Где:
- $user - собственно пользователь из таблицы fio
- $phone - телефон
D' Normalization так то оно так... а на первичном самом этапе? когда обе таблицы пустые и я только создаю пользователя? поле fio нужно в таблицу фио... а поля phone1, phone2... в таблицу phones..
$request->create([
'fio' => $request->fio
]);
создаю пользователя, отдавая только одно поле..
потом сразу же забираю его обратно и далее по Вашей схеме?
Но лучше в таком случае через полиморфическую связь создать таблицу вида поле => значение, и в ее модели сделать свой метод по выводу в правильном формате (с помощью collection map).
dk-web: Я обычно просто делаю в форме массивы:
user[fio]
phones[0]
И в контроллере просто забираю $request->input('user'), $request->input('phones') и работаю уже с отдельными массивами для каждой модели.
Но с таким подходом неудобно делать валидацию ошибок, и переводы ошибок, так как приходится прописывать кастомные правила.
Andrzej Wielski: едрид мадрид) до этого я еще не дошел... collection использую порой, но с map еще не работал... за первичный совет спасибо. буду пробовать...
dk-web: так зачем Phone передавать в функцию? phones - это массив, его нужно просто взять из Request ($phones = $request->input('phones')) и затем через foreach ($phones as $phone) делать то, что вы делаете.