Laravel Eloquent 一次插入 3 行带时间戳

Ben*_*nyi 6 laravel eloquent laravel-5 laravel-5.2

我正在使用 Laravel 5.2 制作网站

我想做的是

  • INSERT 3行同时
  • 新的 3 行必须包含 timestamp created_at updated_at

使用该Query Builder方法insert,是的,它通过传递如下数组一次插入 3 行:

GroupRelation::insert([
    [
        'application_id'    => $applications[0]->a_id,
        'group_id'          => $group->id,
    ],
    [
        'application_id'    => $applications[1]->a_id,
        'group_id'          => $group->id,
    ],
    [
        'application_id'    => $applications[2]->a_id,
        'group_id'          => $group->id,
    ],
]);
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常。但这不能触及时间戳。这意味着created_at updated_at将为空。

但是,如果我将方法更改insertcreate

GroupRelation::create([
   ... 
]);
Run Code Online (Sandbox Code Playgroud)

它收到错误:

ErrorException in Model.php line 2983:
preg_match() expects parameter 2 to be string, array given
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,好像create只能同时接受 1 行,对吗?

我知道insert不是Eloquent. Eloquent触发时间戳但Query Builder不触发。

所以我的问题是:

  1. insert 方法一次可以接受 3 行,但是如何手动触发时间戳?
  2. 通过1.我尝试'created_at' => date('Y-m-d H:i:s'),在数组的每个项目中添加。但控制器不清楚和可怕。
  3. 如何将包含 3 个项目的数组传递给create方法以触发时间戳?
  4. create在循环内部调用是个好主意吗?

附注。protected $guarded = []已分配给空数组,因此不会收到批量分配异常。

非常感谢。

Ale*_*nin 11

insert() 是 Query Builder 的一部分,因此它不使用 Eloquent 功能。

您不能将 3 个项目传递给create()方法,只能传递一个。使用create()内部循环是一个糟糕的主意。

在进行批量插入时,您应该手动添加这些字段:

[
    'application_id'    => $applications[0]->a_id,
    'group_id'          => $group->id,
    'created_at'        => Carbon::now(),
    'updated_at'        => Carbon::now(),
],
Run Code Online (Sandbox Code Playgroud)