Сохранение коллекции в базе данных - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть таблица базы данных с именем UserCommission, для которой я сделал красноречивую модель ниже:

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserCommission extends Model
{
    protected $connection = 'sqlsrv';
    protected $table = 'UserCommission';
}

Теперь в моем контроллере у меня есть много информации, которую я хочу добавить в эту таблицу.Сначала я создал коллекцию, как показано ниже:

        $returnData = new Collection();

        foreach ($datePeriod as $key => $date)
        {
            foreach ($consultants as $consultant)
            {
                $year  = (int) $date->format('Y');
                $month = (int) $date->format('n');

                $commission = new UserCommission();

                $commission->userId = $consultant['UserId'];
                $commission->year   = $year;
                $commission->month  = $month;
                $commission->commissionPercentage = Self::getCommissionPercentage($consultant['UserId'], $consultant['CreatedOn'], $consultant['RoleId'], $date);

                $returnData->push($commission);
            }
        } 

Поэтому, когда я распечатываю возвращаемые данные, он распечатывает коллекцию, заполненную правильными элементами с их свойствами, соответствующими полям таблицы.Я не могу найти, как сохранить это в таблицу.

Я пытался

$returnData->save();

Но это не функция сбора.

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Если вы хотите избежать нескольких вставок подряд (следовательно, избежать проблем с производительностью базы данных из-за последовательных запросов), вы также можете вставить их за один раз, используя Model::insert()

См. https://implode.io/inf5OO для примера.

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

0 голосов
/ 07 февраля 2019

Если вы хотите вставить их все сразу, вы можете обойти коллекцию и сделать это вместо этого:

$commissions = []; 

foreach ($datePeriod as $key => $date)
{
    foreach ($consultants as $consultant)
    {
        $year  = (int) $date->format('Y');
        $month = (int) $date->format('n');

        $commissions[] = [
            'userId' => $consultant['UserId'];
            'year' => $year, 
            'month' => $month
            'commissionPercentage' => Self::getCommissionPercentage($consultant['UserId'], $consultant['CreatedOn'], $consultant['RoleId'], $date);
        ]; 
    }
} 

Так как insert() может принять массив данных, который вы хотите вставить, следующеебыло бы теперь возможно:

UserCommission::insert($commissions);
0 голосов
/ 07 февраля 2019

Вам нужно сделать

$user_commission = new UserCommission;
#Do Stuff
$user_commission->save();

https://laravel.com/docs/5.7/eloquent#inserts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...