2013-12-09 8 views
0

Итак, я работаю с laravel 3, которые используют красноречивый ORM в базе данных mysql. У меня есть функция, которая делает повторные круглые поездки на SQL-сервер, и у меня это работает с моими ограниченными тестовыми случаями, но я не уверен на 100% о порядке операций в sql-запросе, поэтому я был надеясь, что кто-то может дать мне представление о том, насколько я прав. Старый код следующегоmysql "или" порядок запросов "

$notifications = Notification::where(condition-1-a)->where(condition-1-b)->get(); 
    foreach ($locations = DB::table(table)->where(propertyX)->get() as $location) { 
     $extra_notifications = Notification::where(condition-2-a)->where(condition-2-b)->get(); 
     $notifications = array_merge($notifications,$extra_notifications); 
    } 

Я знаю, что приведенный выше код работает, и держат вещи изолирована, потому что каждый запрос выполняется, как это собственный объект, а затем результаты объединяются, но как только вы начнете получать больше места оно занимает время ожидания. Я пытаюсь уменьшить это, имея только одну поездку на сервер sql, и придумал этот код.

$notifications = Notification::where(condition-1-a)->where(condition-1-b); 
    foreach ($locations = DB::table(table)->where(propertyX)->get() as $location) { 
     $notifications = $notifications -> or_where(condition-2-a)->where(condition-2-b); 
    } 
$notifications = $notifications->get(); 

Моя проблема заключается в том, что я не уверен, как работает or_where. Он генерирует строку sql со словами, которые я знаю как код, но я не уверен, что они будут работать одинаково. Сгенерированная строка -

SELECT * FROM `notifications` 
    WHERE `condition-1-a` = ? AND `condition-1-b` = ? 
    OR `condition-2-a` = ? AND `condition-2-b` = ? 
    OR `condition-2-a` = ? AND `condition-2-b` = ? 
    OR `condition-2-a` = ? AND `condition-2-b` = ? 
    ... (etc depending on number of loop iterations) 

Главное, что я ищу, это подтверждение того, как выполняется запрос. Могу ли я ожидать, что я буду работать так?

SELECT * FROM `notifications` 
    WHERE (`condition-1-a` = ? AND `condition-1-b` = ?) 
    OR (`condition-2-a` = ? AND `condition-2-b` = ?) 
    OR (`condition-2-a` = ? AND `condition-2-b` = ?) 
    OR (`condition-2-a` = ? AND `condition-2-b` = ?) 
    ... [etc depending on number of loop iterations] 

Или существует какой-либо другой порядок, в котором оцениваются индексы sql?

(я отредактированный некоторые имена переменных и другие аспекты кода, я сделал все возможное, чтобы кипеть его вниз к чему-то каждый может использовать так, что это не относится к моей ситуации)

ответ

2

MySQL operator precedence

AND имеет более высокий приоритет, чем OR. Ваш первый пример совпадает с вашим вторым.

+0

Прохладный, спасибо. :) – Sidney

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