【问题标题】:Saving a collection to a database将集合保存到数据库
【发布时间】:2019-02-08 01:10:48
【问题描述】:

我有一个名为 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();

但这不是收集功能。

【问题讨论】:

  • 您必须通过$returnData 进行遍历并保存集合中的每个项目。

标签: php laravel eloquent


【解决方案1】:

如果您想避免一个接一个地进行多次插入(从而避免由于连续查询导致的数据库性能问题),您也可以使用Model::insert() 一次性插入它们

有关示例,请参阅 https://implode.io/inf5OO

根据下面的 cmets,请注意他的方法不会为插入的记录触发 eloquent events...

【讨论】:

  • 重要提示:这样做不会触发您在 UserCommission 模型上可能拥有的任何 Eloquent 模型观察者,因此如果您依赖这些模型观察者,则需要采取不同的方法。跨度>
  • 真的!你仍然可以像这样插入它们,并从你的控制器中为插入的记录抛出一个事件。一切都取决于您要插入多少...
  • 是的。只是想我会强调它,因为我自己已经被这个警告所吸引。 :-)
  • 编辑了答案以包含该重要评论;-)
【解决方案2】:

如果你想一次插入它们,你可以绕过 Collection 并这样做:

$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);

【讨论】:

  • create()接受多条记录吗?我一直认为,当您需要不止一个时,您必须使用 insert()...
  • 你是对的,它没有。不知道为什么我认为它确实如此。 insert() 应该改用,就像你提到的那样。
【解决方案3】:

你需要做的

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

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

【讨论】:

  • 这会一次性插入吗?或一次 1 个
  • 我认为您必须一次插入一个。我以前从来没有在 Laravel 中做过多次。
  • 那一个一个,可能不是你想要的;-)
猜你喜欢
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多