仅当一个字段作为数组提供时,Laravel Eloquent 才插入多条记录

Posted

技术标签:

【中文标题】仅当一个字段作为数组提供时,Laravel Eloquent 才插入多条记录【英文标题】:Laravel Eloquent Insert Multiple records only if one field is provided as an array 【发布时间】: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 日期。我在数据库中添加了一个时间戳作为默认值。

【问题讨论】:

不,您必须提供所有字段值。只需在插入之前映射它们。 【参考方案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 方法保持不变,以供将来可能需要的情况使用。

以上是关于仅当一个字段作为数组提供时,Laravel Eloquent 才插入多条记录的主要内容,如果未能解决你的问题,请参考以下文章

仅当需要字段时,Laravel 5.5 验证最小长度

Laravel Eloquent:返回数组键作为字段 ID

仅当 Laravel 接受确认时才关闭模式

牛客 - Elo mountains(AC自动机+可持久化数组优化)

仅当提供 Web API 密钥名称时才能指定 Web API 密钥

MongoDB/Mongoose - 仅当某个字段是唯一的时才将对象添加到对象数组中