2012-10-03 42 views
77

如何使用雄辯ORM在Laravel中執行批量數據庫插入?使用雄辯ORM批量插入Laravel

我想在Laravel中完成此操作:https://stackoverflow.com/a/10615821/600516 但我收到以下錯誤消息。

SQLSTATE [HY093]:無效的參數編號:混合的名稱和位置參數。

+1

你有你的機型'has_many'關係? – PapaSmurf

+1

@jonathandey不,我目前沒有任何關係 – phoenixwizard

+0

@DavidBarker我已經嘗試使用for循環形成quesr字符串。我也嘗試在laravel中使用事務。 – phoenixwizard

回答

171

您可以使用Eloquent::insert()

例如:

$data = array(
    array('name'=>'Coder 1', 'rep'=>'4096'), 
    array('name'=>'Coder 2', 'rep'=>'2048'), 
    //... 
); 

Coder::insert($data); 
+115

注意:這不會更新/創建時間戳。 –

+2

這是否仍然適用於Laravel 4? – advait

+4

@advait:是的,它仍然適用於Laravel 4. – Ola

42

我們可以更新GTF回答更新時間戳記輕鬆

$data = array(
    array(
     'name'=>'Coder 1', 'rep'=>'4096', 
     'created_at'=>date('Y-m-d H:i:s'), 
     'modified_at'=> date('Y-m-d H:i:s') 
     ), 
    array(
     'name'=>'Coder 2', 'rep'=>'2048', 
     'created_at'=>date('Y-m-d H:i:s'), 
     'modified_at'=> date('Y-m-d H:i:s') 
     ), 
    //... 
); 

Coder::insert($data); 

更新: 簡化爲@Pedro莫雷拉建議

$now = Carbon::now('utc')->toDateTimeString(); 
$data = array(
    array(
     'name'=>'Coder 1', 'rep'=>'4096', 
     'created_at'=> $now, 
     'modified_at'=> $now 
     ), 
    array(
     'name'=>'Coder 2', 'rep'=>'2048', 
     'created_at'=> $now, 
     'modified_at'=> $now 
     ), 
    //... 
); 

Coder::insert($data); 
我們可以使用碳日期

UPDATE2:對於laravel 5,請使用updated_at代替o ˚Fmodified_at

$now = Carbon::now('utc')->toDateTimeString(); 
$data = array(
    array(
     'name'=>'Coder 1', 'rep'=>'4096', 
     'created_at'=> $now, 
     'updated_at'=> $now 
     ), 
    array(
     'name'=>'Coder 2', 'rep'=>'2048', 
     'created_at'=> $now, 
     'updated_at'=> $now 
     ), 
    //... 
); 

Coder::insert($data); 
+34

的數組中手動​​設置created_at,updated_at字段,或者在腳本開頭使用Carbon來定義一個'$ now'變量:'$ now = Carbon: :現在( 'UTC') - > toDateTimeString();'。然後,只需使用''created_at'=> $ now,'updated_at'=> $ now'即可。 –

+1

我們如何獲得新插入的行的所有ID? – akshaykumar6

+4

它在Laravel 5中名爲** updated_at **。 – Ben

-1
$start_date = date('Y-m-d h:m:s');   
     $end_date = date('Y-m-d h:m:s', strtotime($start_date . "+".$userSubscription['duration']." months")); 
     $user_subscription_array = array(
      array(
      'user_id' => $request->input('user_id'), 
      'user_subscription_plan_id' => $request->input('subscription_plan_id'), 
      'name' => $userSubscription['name'], 
      'description' => $userSubscription['description'], 
      'duration' => $userSubscription['duration'], 
      'start_datetime' => $start_date, 
      'end_datetime' => $end_date, 
      'amount' => $userSubscription['amount'], 
      'invoice_id' => '', 
      'transection_datetime' => '', 
      'created_by' => '1', 
      'status_id' => '1',), 
array(
      'user_id' => $request->input('user_id'), 
      'user_subscription_plan_id' => $request->input('subscription_plan_id'), 
      'name' => $userSubscription['name'], 
      'description' => $userSubscription['description'], 
      'duration' => $userSubscription['duration'], 
      'start_datetime' => $start_date, 
      'end_datetime' => $end_date, 
      'amount' => $userSubscription['amount'], 
      'invoice_id' => '', 
      'transection_datetime' => '', 
      'created_by' => '1', 
      'status_id' => '1',) 
     ); 
     dd(UserSubscription::insert($user_subscription_array)); 

UserSubscription是我的型號名稱。 如果插入成功,則返回「true」,否則返回「false」。

13

無論誰在閱讀本文,請查看createMany() method

/** 
* Create a Collection of new instances of the related model. 
* 
* @param array $records 
* @return \Illuminate\Database\Eloquent\Collection 
*/ 
public function createMany(array $records) 
{ 
    $instances = $this->related->newCollection(); 

    foreach ($records as $record) { 
     $instances->push($this->create($record)); 
    } 

    return $instances; 
} 
+2

請不要在多個問題上發佈重複的答案。定製你的問題答案。 – miken32

+11

@ miken32那裏有一個stackoverflow警察;)我只是想留下像我這樣的絕望谷歌的筆記,就這些。答案完全不言自明。 – Alex

+2

如果您想留言,請作爲評論。答案需要超過一個句子,並鏈接到一些源代碼。 – miken32

6

這是你如何在更雄辯的方式做到這一點,

$allintests = []; 
    foreach($intersts as $item){ //$intersts array contains input data 
     $intestcat = new User_Category(); 
     $intestcat->memberid = $item->memberid; 
     $intestcat->catid= $item->catid; 
     $allintests[] = $intestcat->attributesToArray(); 
    } 
    User_Category::insert($allintests); 
0

或使用Laravel的工廠時(創建10個用戶):

$users = factory(App\User::class, 10)->make()->toArray(); 

App\User::insert($users); 
-2

也許更Laravel的方式來解決這個問題是使用一個集合並利用時間戳利用模型插入它。

<?php 

use App\Continent; 
use Illuminate\Database\Seeder; 

class InitialSeeder extends Seeder 
{ 
    /** 
    * Run the database seeds. 
    * 
    * @return void 
    */ 
    public function run() 
    { 
     collect([ 
      ['name' => 'América'], 
      ['name' => 'África'], 
      ['name' => 'Europa'], 
      ['name' => 'Asia'], 
      ['name' => 'Oceanía'], 
     ])->each(function ($item, $key) { 
      Continent::forceCreate($item); 
     }); 
    } 
} 

編輯:

對不起,我的誤解。對於批量插入,這可能有所幫助,也許有了這個,你可以做出好的播種機並優化它們。

<?php 

use App\Continent; 
use Carbon\Carbon; 
use Illuminate\Database\Seeder; 

class InitialSeeder extends Seeder 
{ 
    /** 
    * Run the database seeds. 
    * 
    * @return void 
    */ 
    public function run() 
    { 
     $timestamp = Carbon::now(); 
     $password = bcrypt('secret'); 

     $continents = [ 
      [ 
       'name' => 'América' 
       'password' => $password, 
       'created_at' => $timestamp, 
       'updated_at' => $timestamp, 
      ], 
      [ 
       'name' => 'África' 
       'password' => $password, 
       'created_at' => $timestamp, 
       'updated_at' => $timestamp, 
      ], 
      [ 
       'name' => 'Europa' 
       'password' => $password, 
       'created_at' => $timestamp, 
       'updated_at' => $timestamp, 
      ], 
      [ 
       'name' => 'Asia' 
       'password' => $password, 
       'created_at' => $timestamp, 
       'updated_at' => $timestamp, 
      ], 
      [ 
       'name' => 'Oceanía' 
       'password' => $password, 
       'created_at' => $timestamp, 
       'updated_at' => $timestamp, 
      ], 
     ]; 

     Continent::insert($continents); 
    } 
} 
+0

這使每個項目一個查詢。這不是批量插入。 –

+1

@EmileBergeron我同意你的意見。我編輯了我的帖子,所以也許這可能有助於批量插入。考慮到將任務花費很多時間(碳,加密),這可以爲您節省大量時間。 –

0

我搜索了很多次,最後用自定義timestamps象下面這樣:

$now = Carbon::now()->toDateTimeString(); 
Model::insert([ 
    ['name'=>'Foo', 'created_at'=>$now, 'updated_at'=>$now], 
    ['name'=>'Bar', 'created_at'=>$now, 'updated_at'=>$now], 
    ['name'=>'Baz', 'created_at'=>$now, 'updated_at'=>$now], 
    .................................. 
]);