2017-10-07 19 views
5

laravel雄弁が行を更新する際に1つのクエリしか実行しないかどうか不思議でした。だから私は、次のLaravel Eloquent更新時に2つのクエリを実行しますか?

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); 
}); 

を試してみましたこれは、だから私はDBファサードを使用して考えた私は、次のような結果

{ 
    "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 
} 
] 
} 

を与えました。それはクライアントのインスタンスを返されませんでしたが

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 
} 
] 
} 

これ一つでは、唯一のクエリを実行しました。私の質問は、方法や戦略を使用する必要があるトラフィックの多いサーバーの場合ですか?他にも優れたテクニックやテクニックがありますか?

答えて

4

私はあなたが選択し、それは間違いなく2つのクエリを実行しますので、値を更新している最初のクエリで正しくその後、あなたの質問を理解している場合あなたが

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

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

を雄弁するために、クエリの下に変更することができます。 2つ目の方法では、dbから考えるものをフェッチしないので、最初より速くなります。

+0

もう1つの短い質問です。 DB :: select()は雄弁に比べて速いのですか? –

+1

私はそれがパフォーマンスの問題で大きな違いを作ってくれるとは思っていません。大きな結合クエリでは、より高速なパフォーマンスを与えるかもしれません。 – iCoders

関連する問題