Можно ли использовать Laravel Eloquent методы в цикле?

154
27 декабря 2018, 15:10

В документации Laravel Eloquent есть методы например Model::UpdateOrCreate(), но нету примеров, как использовать эти методы для множества строк, в stackoverflow нашел пример, где предлагается для множества строк использовать цикл:

foreach($users as $user){
    User::create($user);
}

Насколько целесообразно использовать query запрос в цикле ?

Может ли быть, что ларавел использует асинхронные технологии, например, queue или другие возможности которые разрешают использовать такие запросы внутри цикла ?

Answer 1

На гитхабе обсуждали это: https://github.com/laravel/framework/issues/1295

Следующий код создает столько запросов сколько итераций.

foreach ($users as $user) {
    User::create($user);
}

Вот что писал про это автор Laravel:

It would be relatively easy to do this; however, events would not be fired. The only thing it would be buying you is the timestamp insertion.

Перевод: это было бы относительно легко сделать; однако события не будут запущены. Это только поможет вставлять timestamp автоматически.

и это:

Honestly just use the query builder for this. Will be much more efficient and makes more sense.

Перевод: Честно говоря, просто используйте построитель запросов для этого. Будет намного эффективнее и иметь больше смысла.

Один из пользователей предложил вариант ниже, но он тоже не генерирует события:

abstract class Model extends BaseModel
{
    /**
     * @return string
     */
    public static function table()
    {
        return with(new static)->table;
    }
    /**
     * Insert each item as a row. Does not generate events.
     *
     * @param  array  $items
     *
     * @return bool
     */
    public static function insertAll(array $items)
    {
        $now = \Carbon\Carbon::now();
        $items = collect($items)->map(function (array $data) use ($now) {
            return $this->timestamps ? array_merge([
                'created_at' => $now,
                'updated_at' => $now,
            ], $data) : $data;
        })->all();
        return \DB::table(static::table())->insert($items);
    }
}

Пример использования:

Administrator::insertAll([
    ['name' => 'Zane'],
    ['name' => 'Rob'],
]);

Источник кода

READ ALSO
Как вывести поле ACF в файле functions.php?

Как вывести поле ACF в файле functions.php?

В шаблоне имеется следующий код, выводящий 6 последних новостей:

212
Асинхронность в php

Асинхронность в php

друзья! У меня реализовано пару парсеров, который проходят капчу и тянут информацию, что занимает очень много времениОсобенно, если на сайте...

171
Не открывается файл на чтение Wordpress

Не открывается файл на чтение Wordpress

Работаю с библиотекой PHPExcel в Wordpress нужно прочесть данные из excel файла, взял отсюда - https://packagistorg/packages/phpoffice/phpexcel Получаю ошибку

161
не доходят письма на почту

не доходят письма на почту

делал новый сайт, и переносил обработчик для формы с старого, на старом все работает, когда перенёс на новом перестали доходить письма на почту,...

179