首頁 >後端開發 >php教程 >Eloquent 批次更新多筆記錄(存在時update,不存在時insert)

Eloquent 批次更新多筆記錄(存在時update,不存在時insert)

WBOY
WBOY原創
2016-09-23 11:31:011899瀏覽

Eloquent 批次更新多筆記錄(存在時update,不存在時insert)

不是對一筆記錄多個欄位批量賦值。

類似批次插入:

<code>DB::table('users')->insert(array(
  array('email' => 'aaa@example.com', 'name' => 'zhangsan', 'age'=> 0),
  array('email' => 'bbb@example.com', 'name' => 'wangwu', 'age'=> 0),
  ...
));
</code>

有沒有類似的語句:

<code>DB::table('users')->update( array(
  array('email' => 'aaa@example.com', 'name' => 'zhangsan', 'age'=> 20),
  array('email' => 'bbb@example.com', 'name' => 'wangwu', 'age'=> 25),
  array('email' => 'ccc@example.com', 'name' => 'chenliu', 'age'=> 50),
  ...
) , 'email' );
</code>

實現的功能是:

1.查詢條件存在時,批次更新原資料;

<code>例:
email='aaa@example.com'时, 'age'修改为 20,
email='bbb@example.com'时, 'age'修改为 25,
...
</code>

2.查詢條件不存在時,批次插入資料。

<code>例:
email='ccc@example.com'时, 'age'修改为 50,
...
</code>

我的程式碼是:

<code>public function updateOrCreate (Request $request) {
  
  $insert_array = [];

  $datas = $request->all();

  foreach ($datas as $key=> $data) {
    $user = User::where('email', $data['email'])->first();
    if (!$user) {
        $insert_array[] = $data;
    // 更新原数据
    } else {
        $user->email = $data['email'];
        $user->age = $data['age'];
        $user->save();
    }
  }
  // 批量插入数据
  User::insert($insert_array);
}
</code>

以上的程式碼,在更新資料為千筆以上時,就出現效能問題了!

求教,有沒有更好的解決方法呢?

請多指點。

回覆內容:

Eloquent 批次更新多筆記錄(存在時update,不存在時insert)

不是對一筆記錄多個欄位批量賦值。

類似批次插入:

<code>DB::table('users')->insert(array(
  array('email' => 'aaa@example.com', 'name' => 'zhangsan', 'age'=> 0),
  array('email' => 'bbb@example.com', 'name' => 'wangwu', 'age'=> 0),
  ...
));
</code>

有沒有類似的語句:

<code>DB::table('users')->update( array(
  array('email' => 'aaa@example.com', 'name' => 'zhangsan', 'age'=> 20),
  array('email' => 'bbb@example.com', 'name' => 'wangwu', 'age'=> 25),
  array('email' => 'ccc@example.com', 'name' => 'chenliu', 'age'=> 50),
  ...
) , 'email' );
</code>

實現的功能是:

1.查詢條件存在時,批次更新原資料;

<code>例:
email='aaa@example.com'时, 'age'修改为 20,
email='bbb@example.com'时, 'age'修改为 25,
...
</code>

2.查詢條件不存在時,批次插入資料。

<code>例:
email='ccc@example.com'时, 'age'修改为 50,
...
</code>

我的程式碼是:

<code>public function updateOrCreate (Request $request) {
  
  $insert_array = [];

  $datas = $request->all();

  foreach ($datas as $key=> $data) {
    $user = User::where('email', $data['email'])->first();
    if (!$user) {
        $insert_array[] = $data;
    // 更新原数据
    } else {
        $user->email = $data['email'];
        $user->age = $data['age'];
        $user->save();
    }
  }
  // 批量插入数据
  User::insert($insert_array);
}
</code>

以上的程式碼,在更新資料為千筆以上時,就出現效能問題了!

求教,有沒有更好的解決方法呢?

請多指點。

1.將查詢改為DB操作
2.foreach裡面不要有查詢操作
3.可以將所有email組裝一條查詢語句查詢,由服務端比對當前哪條記錄存在

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn