Laravel Eloquent一次插入3行时间戳

时间:2016-12-28 16:48:15

标签: laravel laravel-5 eloquent laravel-5.2

我正在使用Laravel 5.2建立一个网站

我想做的是

  • INSERT同时3行
  • 新的3行必须包含时间戳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,
    ],
]);

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

但是,如果我将方法insert更改为create

GroupRelation::create([
   ... 
]);

收到错误:

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

如果我没错,似乎create可以同时接受1行,对吗?

我知道insert不属于EloquentEloquent会触发时间戳,但Query Builder却没有。

所以我的问题是:

  1. insert方法一次可以接受3行,但是如何手动触发时间戳?
  2. 1.我试图在数组的每个项目中添加'created_at' => date('Y-m-d H:i:s'),。但控制器不清楚可怕。
  3. 如何将3个项目的数组传递给create方法以触发时间戳?
  4. 在循环中调用create是个好主意吗?
  5. PS。 protected $guarded = []已分配给空数组,因此不会收到批量分配例外。

    非常感谢你。

2 个答案:

答案 0 :(得分:4)

insert()是查询构建器的一部分,因此它不使用Eloquent功能。

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

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

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

答案 1 :(得分:0)

您可以使用dateTime课程:

[
    'application_id'    => $applications[0]->a_id,
    'group_id'          => $group->id,
    'created_at'        => new \dateTime,
    'updated_at'        => new \dateTime,
],