Heim  >  Artikel  >  Backend-Entwicklung  >  Eloquent 批量更新多条记录(存在时update,不存在时insert)

Eloquent 批量更新多条记录(存在时update,不存在时insert)

WBOY
WBOYOriginal
2016-09-23 11:31:011837Durchsuche

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组装一条查询语句查询,由服务端比对当前哪条记录存在

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn