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組裝一條查詢語句查詢,由服務端比對當前哪條記錄存在