Laravel Eloquent 更新时运行两个查询?

5

我很好奇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 Facade。

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实例。我的问题是,在高流量服务器上,需要使用哪种方法或策略?Eloquent中是否有其他更好的技巧或诀窍可用?

1个回答

4
您可以将下面的查询改为Eloquent。
$client = DB::select("update clients set first_name= 'Admin test' WHERE id=1");

to

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

如果我理解您的问题正确,那么在第一次查询中,您正在选择然后更新值,因此它肯定会执行两个查询。在您的第二种方法中,您没有从数据库中获取任何信息,所以比第一种方法更快。

另一个简短的问题。DB::select() 比 eloquent 更快吗? - Noob Coder
1
我认为这不会对性能问题产生太大影响。在大型联接查询中,它可能会提供更快的性能。Eloquent 更易读。 - Vision Coderz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接