2017-10-07 5 views
5

J'étais curieux de savoir, si laravel eloquent n'exécute qu'une requête sur la mise à jour d'une ligne. J'ai donc essayé les éléments suivantsLaravel Eloquent Exécute deux requêtes à la mise à jour?

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

Cela m'a donné le résultat suivant

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

donc je pensé à utiliser la DB de façade.

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

et le résultat est

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

Celui-ci a couru une seule requête si elle n'a pas retourné l'instance du client. Ma question est, pour un serveur à fort trafic quelle méthode ou stratégie est nécessaire d'utiliser? Y a-t-il d'autres techniques ou astuces qui soient éloquentes à utiliser?

Répondre

4

Vous pouvez modifier ci-dessous requête éloquent

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

à

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

Si je comprends bien votre question, puis dans la première requête que vous sélectionnez et la valeur mise à jour il exécutera certainement deux requêtes . Dans votre seconde méthode, vous n'obtiendrez rien à partir de db, donc ce sera plus rapide que le premier

+0

Une autre petite question. DB :: select() est-il plus rapide qu'éloquent? –

+1

Je ne pense pas que cela fera beaucoup de différence dans les problèmes de performance. Dans les grandes requêtes de jointure, il pourrait donner des performances plus rapides. Eloquent est beaucoup de lisibilité – iCoders