2016-12-28 58 views
1

我正在做一個網站與Laravel 5.2Laravel雄辯一次插入3行與時間戳

我想要做的是在同一時間

  • INSERT 3行
  • 新3行必須包含時間戳created_atupdated_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_atupdated_at將爲空。

但是,如果我改變了方法insertcreate

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

它收到的錯誤:

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

如果我沒有錯,它似乎像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是個好主意嗎?

PS。 protected $guarded = []已分配給空數組,因此不會收到質量分配異常。

非常感謝。

回答

1

insert()是查詢生成器的一部分,因此它不使用Eloquent功能。

您不能將3項傳遞給create()方法,只能有一項。並且使用create()內部循環是可怕的想法。

您應該手動添加這些領域做批量插入時:

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

謝謝!是的,我已經完成了!但我有3排。如你所見,我有3個數組。它們中的每一個幾乎都是相同的,其中'$ applications'指數有點不同。如果手動將'created_at'' updated_at'添加到數組集合,則代碼重複三次。還有什麼想法? – Benyi

+0

我確定已經有這樣的問題了,爲什麼不是搜索重複的選擇來回答?我只是好奇... – Kyslik

+0

@Benyi你可以創建一個數組,然後只是遍歷它,並添加時間戳到每個項目。這是你得到的最好的解決方案。 –

0

您可以使用dateTime類:

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

謝謝你的回答。在這個問題中,獲得當前時間的方式並不相關。這是關於時間戳不是通過'insert()'方法更新的。並且它不能通過能夠更新時間戳的'create'方法插入多於一行。 – Benyi