2015-03-13 4 views
3

У меня есть следующий запрос:Laravel Eloquent ORM - комплекс, где запросы

DB::select("SELECT * FROM mod_dns_records WHERE (scheduled = 'N' AND scheduleTime = 0 AND domainId = {$id}) OR (deleteRow = 'Y' AND domainId = {$id})"); 

Однако, это не безопасно против инъекции SQL. Может ли кто-нибудь помочь мне сделать это в безопасности или рассказать мне, как восстановить это с помощью ORM.

Спасибо!

ответ

9

Это будет запрос, как у вас это

$result = DB::table('mod_dns_records') 
      ->where('scheduled', 'N') 
      ->where('scheduleTime', 0) 
      ->where('domainId', $id) 
      ->orWhere('deleteRow', 'Y') 
      ->where('domainId', $id) 
      ->get(); 

Однако я заметил, что это может быть оптимизирован немного, так как условие domainId существует в обеих группах:

$result = DB::table('mod_dns_records') 
      ->where('domainId', $id) 
      ->where(function($q){ 
       $q->where('scheduled', 'N'); 
       $q->where('scheduleTime', 0); 
       $q->orWhere('deleteRow', 'Y'); 
      }) 
      ->get(); 
+0

Обратите внимание, что первый пример работает только потому что OR имеет более низкий приоритет, чем AND - он не добавляет никаких скобок группировки, как в исходном запросе. С другой стороны, где (... callback ...) во втором примере добавляются круглые скобки. – alx

Смежные вопросы