Laravel Eloquent 在更新时运行两个查询?
Laravel Eloquent Runs two queries on update?
我很想知道,如果 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中还有其他更好的技术或技巧可以使用吗?
您可以将以下查询更改为 eloquent
$client = DB::select("update clients set first_name= 'Admin test' WHERE id=1");
至
$data=['first_name'=>'Admin test'];
Client::where('id', '=', 1)->update($data);
如果我正确理解你的问题,那么在第一个查询中你选择然后更新值,所以它肯定会执行两个查询。
在你的第二种方法中你没有从数据库中获取任何想法所以它会比第一个更快
我很想知道,如果 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中还有其他更好的技术或技巧可以使用吗?
您可以将以下查询更改为 eloquent
$client = DB::select("update clients set first_name= 'Admin test' WHERE id=1");
至
$data=['first_name'=>'Admin test'];
Client::where('id', '=', 1)->update($data);
如果我正确理解你的问题,那么在第一个查询中你选择然后更新值,所以它肯定会执行两个查询。 在你的第二种方法中你没有从数据库中获取任何想法所以它会比第一个更快