Laravel Eloquent在更新上运行两个查询?

问题描述:

我很好奇知道,如果laravel雄辩只运行一个查询更新行。所以,我想下面的Laravel Eloquent在更新上运行两个查询?

Route::get('/cli', function(){ 
    DB::enableQueryLog(); 

    $client = Client::findOrFail(1); 
    $client->first_name = 'Noob'; 
    $client->save(); 
    return response()->json([ 
     'client' => $client->first_name, 
     'query' => DB::getQueryLog() 
    ], 200); 
}); 

这给了我以下结果

{ 
    "client": "Noob", 
    "query": [{ 
       "query": "select * from `clients` where `clients`.`id` = ? limit 1", 
    "bindings": [ 
      1 
     ], 
    "time": 0.71 
}, 
{ 
     "query": "update `clients` set `first_name` = ?, `updated_at` = ? where `id` = ?", 
     "bindings": [ 
      "Noob", 
      "2017-10-07 12:03:05", 
      1 
     ], 
     "time": 3.36 
} 
] 
} 

所以我想过使用DB门面。

Route::get('/cli', function(){ 
    DB::enableQueryLog(); 
$client = DB::select("update clients set first_name= 'Admin test' WHERE id=1"); 

    return response()->json([ 
     'client' => $client->first_name, 
     'query' => DB::getQueryLog() 
    ], 200); 
}); 

,其结果是

{ 
"client": [], 
"query": [ 
{ 
"query": "update clients set first_name= 'Admin test' WHERE id=1", 
"bindings": [], 
"time": 3.2 
} 
] 
} 

这一次只跑了一个查询虽然它没有返回的客户端实例。我的问题是,对于需要使用哪种方法或策略的高流量服务器?有没有其他更好的技巧或窍门可以使用?

您可以在下面的查询更改为佞

$client = DB::select("update clients set first_name= 'Admin test' WHERE id=1"); 

$data=['first_name'=>'Admin test']; 
    Client::where('id', '=', 1)->update($data); 

如果我理解正确你的问题,然后在您选择的第一个查询,然后更新值,所以它肯定会执行两个查询。 在你的第二种方法中,你没有从db中获取任何想法,所以它会比第一个更快

+0

另一个小问题。 DB :: select()比口才更快吗? –

+1

我不认为它会在性能问题上有很大的不同。在大型连接查询中,它可以提供更快的性能。偶尔有很多可读性 – iCoders