Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 31.10.2020 19:25:08

Множественная запись

Есть двухмерный массив, который получаю из формы:

(
['services_id' => $data[$row]['id']],
['date' => $data[$row]['date']],
['accruals' => $data[$row]['accruals']]
)

В БД записываю так:

        $accrual->fill([
            'services_id' => $data[0]['id'], 'date' => $data[0]['date'], 'accruals' => $data[0]['accruals']
            ]
        ) ->save();

Но это всего лишь одна запись из формы. А их может быть порядка 10-15.
Не могу понять как записывать в БД сразу все записи из формы.
В модели прописал разрешение на множественную запись

protected $fillable = ['services_id', 'date', 'accruals'];

Не в сети

#2 01.11.2020 11:01:24

Re: Множественная запись

$accruals = [];
        foreach ($data as $accrualData) {
            $accruals[] = [
                'services_id' => $accrualData['id'],
                'date' => $accrualData['date'],
                'accruals' => $accrualData['accruals'],
            ];
        }
        Accrual::insert($accruals);

Не в сети

#3 01.11.2020 21:46:17

Re: Множественная запись

Большое спасибо Владислав. Вы очень помогли мне с решением этой задачи. Правда заметил, что при массовом заполнении поля timestamp не заполняются. Как мне поправить это если это требует ситуация. или подскажите направление где искать ответ.   smile smile smile

Не в сети

#4 02.11.2020 20:57:07

Re: Множественная запись

Добавьте в $accruals[] кличи таймстампов, и fillable в модели Accrual

Не в сети

#5 02.11.2020 22:24:25

Re: Множественная запись

Владислав, скажите пожалуйста... А такое поведение timestamps нормальное? При такой записи нужно вручную их записывать? Или я все же делаю что-то не правильно?

Добавьте в $accruals[] кличи таймстампов, и fillable в модели Accrual

Сделал как вы сказали. теперь все на месте.

Не в сети

#6 02.11.2020 22:30:43

Re: Множественная запись

Т.к. происходит insert, то не срабатывают события модели, которые под капотом устанавливают таймстамп свойства.
Если же в цикле делать ::create модели, то они бы устанавливались автоматом. Но тогда будет N запросов в БД. А при insert- 1 запрос

Посмотрите в вендоре HasTimestamps. У него есть методы setCreatedAt и setUpdatedAt.
Их вызывает performInsert() из класса Model, который вызывается ->save() модели.

Не в сети

Подвал раздела