2016-04-03 8 views
3

У меня проблема с моим запросом в Laravel eloquent, я не получаю результаты, когда запускаю запрос, и сгенерированный запрос кажется не таким, каким я ожидаю.Advanced Where Clause В Laravel

Это код в контроллере:

$lastUpdate = Input::get('last_update'); 
$userId = Auth::user()->id; 

$eventIds = EventVendor::where('user_id', $userId) 
        ->where('is_active', 1)->get()->lists('event_id'); 

$events = EventDetails::whereIn('id', $eventIds) 
        ->where(function($query) use ($lastUpdate) { 
         $query->where('created_at', $lastUpdate); 
         $query->orWhere('updated_at', $lastUpdate); 
        }) 
        ->where('is_active', 1) 
        ->with("details_sub") 
        ->with("extras") 
        ->with("chargesDiscounts") 
        ->toSql(); 

Это запрос, который генерируется:

select * from `mtgh_event_details` 
    where `mtgh_event_details`.`deleted_at` is null 
     and 0 = 1 
     and (`created_at` = ? or `updated_at` = ?) 
     and `is_active` = ? 

Помимо 0 = 1, который не должен быть там я не вижу полный запрос.

+0

Действительно ли «0 = 1» отображается в вашем запросе или это то, что вы изменили для вопроса? – patricus

+0

Он появляется в моем запросе. – user3718908

ответ

1

Так я нашел этот вопрос, по-видимому эта часть запроса

$eventIds = EventVendor::where('user_id', $userId) 
        ->where('is_active', 1)->get()->lists('event_id'); 

возвращается нуль или пустой список, следовательно, 0 = 1 в моем запросе. Также с помощью другого ответа я смог немного упростить свой код, поэтому спасибо. :)

3

Появляется сообщение 0 = 1, потому что запрос заполнить ваш $eventIds не возвращает никаких результатов, поэтому ваш Collection пуст. Если вы пройдете пустой массив (или Collection) до whereIn(), он сократит запрос, добавив в 0 = 1, так как поиск where id in() является недопустимым SQL, и логический поиск в пустом наборе всегда будет возвращать результаты в любом случае. Этот ярлык был добавлен в 4.2.17 с this pull request.

Что касается остальной части запроса, все выглядит нормально для меня. Операторы with() настраивают активную загрузку, в которой используются отдельные операторы SQL; он не использует объединения.

Таким образом, поскольку у вас есть три with() заявления, вы на самом деле будете запущены четыре отдельных запросов, один, чтобы получить EventDetails, а затем по одному, чтобы загрузить ваш details_sub, extras и chargesDiscounts для нагруженных деталей событий.

Поскольку они являются отдельными запросами, они не будут отображаться на выходе toSql().


Другие ноты:

  • При получении идентификаторов событий, вам не нужно вызывать ->get()->lists(), вы можете просто позвонить ->lists() по запросу. Если вы сначала вызовете get(), он будет загружать полные объекты в Collection, а затем вы вызываете lists() на Collection. Вы можете избежать загрузки всего Collection в первую очередь, просто позвонив lists() по самому запросу.

  • Предполагая, что у вас установлена ​​связь, вы можете избежать первоначального запроса, чтобы получить идентификаторы в первую очередь. Вместо этого вы можете использовать whereHas() method. Ваш запрос будет выглядеть следующим образом:

    $lastUpdate = Input::get('last_update'); 
    $userId = Auth::user()->id; 
    
    // assumes a relationship named 'vendor' 
    $events = EventDetails::whereHas('vendor', function($query) use ($userId) { 
          // $query is query for the EventVendors 
          $query->where('user_id', $userId)->where('is_active', 1) 
         }) 
         ->where(function($query) use ($lastUpdate) { 
          $query->where('created_at', $lastUpdate); 
          $query->orWhere('updated_at', $lastUpdate); 
         }) 
         ->where('is_active', 1) 
         ->with("details_sub") 
         ->with("extras") 
         ->with("chargesDiscounts") 
         ->toSql(); 
    
+0

user3718908 Я обновил свой ответ, чтобы предоставить некоторую информацию о вашей проблеме 0 = 1. – patricus