【问题标题】:Laravel Eloquent Insert Multiple records only if one field is provided as an array仅当一个字段作为数组提供时,Laravel Eloquent 才插入多条记录
【发布时间】:2018-03-26 21:34:42
【问题描述】:

如果只提供一个字段作为数组,Laravel / Eloquent 是否提供了一种通过一次调用创建多条记录的方法?

例如,我得到 $request 并带有下面的数据,但只有 propIds 会被分解并作为数组提供,所有其他值对于所有新记录都是相同的。

{"_token": "kEKmrPzu4nCk35xJAMOgdl0kNdwUZvpECsBl91dH",
"propIds": "126,129,71,82,77,64,69",
"rate": "4",
"cost": "55"
}

我可以做一个 foreach 并构建一个数组,然后运行 ​​Model::insert($newArray); 但也许 Laravel 确实提供了一个解决方案,如果只提供一个字段作为数组。谢谢。

现在我只是使用 foreach 循环创建数组,然后调用 Model::insert($newArray);

使用Model::insert($newArray); 插入多条记录不会自动添加 created_at 和 updated_at 日期。我在数据库中添加了一个时间戳作为默认值。

【问题讨论】:

  • 不,您必须提供所有字段值。只需在插入之前映射它们。

标签: php mysql arrays laravel eloquent


【解决方案1】:

是的,这是可能的。您需要使用insert() 并使用以下格式创建一个新数组:

Model::insert([
    ['prop_id' => 126, 'rate' => 4, 'cost' => 55],
    ['prop_id' => 129, 'rate' => 4, 'cost' => 55],
    ['prop_id' => 71, 'rate' => 4, 'cost' => 55],
]);

insert() 将只创建一个数据库查询。

【讨论】:

    【解决方案2】:

    您可以覆盖 Laravel 模型 create 函数,如下所示:

    型号

    namespace App\Models;
    
    class YourModel extends BaseModel
    {
      protected $fillable = [
        "_token", "propId", "rate", "cost"
      ];
    
      // override
      public static function create(array $attributes = [])
      {
        $propIds = array_explode(',', $attributes['propIds']);
    
        foreach ($propIds as $key => $value) {        
          $model = new static([
            "_token"  => $attributes['_token'],
            "propId"  => $value,
            "rate"    => $attributes['rate'],
            "cost"    => $attributes['cost']
          ]);
    
          $model->save();
        }
      }
    }
    

    控制器

    YourModel::create([
       "_token"  => $request->input('_token'),
       "propIds" => $request->input('propIds'), // "126,129,71,82,77,64,69"
       "rate"    => $request->input('rate'),
       "cost"    => $request->input('cost'),
    ]);
    

    【讨论】:

    • 我认为定义一个新方法会更有意义,例如createMany,它在内部利用现有的create 方法。这使得原始的 create 方法保持不变,以供将来可能需要的情况使用。
    猜你喜欢
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2012-05-26
    • 2020-05-21
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多