2016-02-26 116 views
0

我有这个疑问:Laravel 5.2 - 更新以前的查询

Sendqueue::select() 
      ->where('userID', Session::get('uid')) 
      ->where('campaign', $id) 
      ->where('status', 'pending') 
      ->update(array(
       'status'  => 'stopped',  
       )); 

的问题是,它要经过做更新的记录量使得它需要大约15分钟左右完成。

我想分解它,所以选择和更新查询是单独的实体。有点像这样:

$pending = Sendqueue::select() 
      ->where('userID', Session::get('uid')) 
      ->where('campaign', $id) 
      ->where('status', 'pending') 
      ->get(); 

$pending->update(array(
      'status'  => 'stopped',  
      )); 

我该怎么做呢?还是有更简单的方法?

谢谢!

+0

任何人都可以解释为什么第一个查询是次优运行? –

回答

0

我没在想,我想出了答案。我不得不在foreach这样运行的第二部分:

$records = Sendqueue::select() 
      ->where('userID', Session::get('uid')) 
      ->where('campaign', $id) 
      ->where('status', 'pending') 
      ->get(); 

foreach ($records as $record) { 
     DB::table('sendqueue') 
      ->where('ID', $record->ID) 
      ->update(['status' => 'stopped']); 
} 
+0

我无法理解为什么使用查询生成器的原因,而您实际上是集合中的模型实例。在你的foreach语句中,只需调用$ record-> update(['status'=>'stopped'])。此外,如果您遇到内存使用问题,则应考虑避免使用foreach语句,并利用$ records集合中的块方法。 –

+0

foreach的另一个问题是,如果任何记录不更新数据库,那么它可能会导致问题,所以使用'Transactions'来达到这个目的。 –

-1
$my_id = preg_replace ('#[^0-9]#', '', $request->id); 
     if (! empty ($my_id)) { 
      $this->c->where ('id', $my_id)->update ([ 
        'first_name' => $request->get ('first_name'), 
        'last_name' => $request->get ('last_name') , 
        'phone' => $request->get ('phone') 
      ]);`enter code here` 
      \Session::flash ('message', 'Update Successful'); 
      return redirect ('customer'); 
     } 
     $this->edit(); 

http://developer.e-power.com.kh/update-query-in-laravel-5-2/

0
protected $table="user"; 
public function updateUser($id,$username) 
{ 
    $resultData = array(); 
    $updateArray = array('user_name'=>$username); 
    $update=DB::table('user') 
      ->where('user_id', $id) 
      ->update($updateArray); 


    return $resultData['status'] = true;   
}