Laravel создает или обновляет множество в связанном с моделью отношении из формы

#php #laravel #forms #relationship

#php #laravel #формы #отношения

Вопрос:

Я хочу создать / обновить все записи из формы, я ищу чистое решение, которое не использует никаких циклов, следующее можно легко исправить с помощью цикла. Я использую laravel 5.8

Класс модели: Школа -> hasMany (Класс модели: Program)

Это метод хранения (это требует исправления)

 public function store(Request $request, School $school)
{
    $school->programs()->createMany(array($request->day, $request->schedule));
}
  

Это метод обновления (это требует исправления)

 public function update(Request $request, School $school)
{
    $school->programs()->update(array($request->day, $request->schedule));
}
  

Форма имеет простой ввод массива

 <td width><input type="number" name="day[]" placeholder="Course Day (1-5)" class="form-control" /></td>
<td width><input type="text" name="schedule[]" placeholder="Actual schedule" class="form-control" /></td>
  

введите описание изображения здесь
введите описание изображения здесь

  1. Как я могу правильно использовать createMany и передать массив
    массивов?
  2. Как я могу правильно обновить вышеупомянутые массивы?

Пожалуйста, попробуйте предоставить чистое решение, я только что создал приведенный выше пример, чтобы попытаться изучить правильное структурирование и управление данными в laravel.

Комментарии:

1. структура базы program данных таблицы?

2. Я ищу решение для функций store () и update (), а не для базы данных 🙂

3. да, нам нужно знать столбцы таблицы programs

4. добавлена таблица programs для справки, спасибо

Ответ №1:

Я не знаю, достаточно ли понятен для вас этот ответ, но самое близкое, что я могу получить, это использовать map функцию сбора.

 public function store(Request $request, School $school)
{

    $school->programs()->createMany(
        collect($request->day)->map(function($day, $key) {
            return [
                'day' => $day,
                'schedule' => request('schedule')[$key],
            ];
        })->toArray()
    );
}
  

Комментарии:

1. Просто быстрое исправление для вашей функции, вы должны добавить collect(….)-> toArray() для обработки, кроме этого, большое вам спасибо.

Ответ №2:

Я предполагаю, что каждое значение в ключе «день» совпадает с каждым значением в ключе «расписание», например, день «1» совпадает с расписанием «test1». Мы могли бы сделать что-то вроде этого.

 public function store(School $school)
{
    collect(request('day'))->map(function ($day, $index) {
        return [
            'day' => day,
            'schedule' => request('schedule')[$index]
        ];
    )->each(function ($program) use ($school) {
        $school->programs()->create($program);
    });
}
  

Чтобы сделать код немного чище, я использую вспомогательную функцию request() вместо объекта $request .