2015-10-18 2 views
2

Я написал это, и мне просто интересно, если это лучший способ сделать это. Заказы имеют много сделок ... Сделки принадлежат заказу. Я запрашиваю заказ с идентификаторами, превышающими последний идентификатор, отправленный для выполнения. Затем я хочу только заказы, которые утвердили статус оплаты или являются автономными способами оплаты.Laravel complex scope запрос отношение (для обзора)

Этот код работает, просто интересно, если это лучший способ сделать это:

/** 
* Get all orders pending fulfilment 
* 
* @param $query 
* @param $last_fulfiled 
* @return \Illuminate\Database\Eloquent\Builder 
*/ 
public function scopeToFulfil($query, $last_fulfiled) 
{ 
    return $query->where('id', '>', $last_fulfiled) 
     ->where(function($query) { 
     $query->whereHas('transactions', function ($query) { 
      $query->where('status', '>=', 5); 
     })->orWhere('payment_method', '=', 2); 
    }); 
} 

EDIT:

Вот SQL синтаксис:

select * from `orders` where `orders`.`deleted_at` is null and `id` > ? and ((select count(*) from `transactions` where `transactions`.`order_id` = `orders`.`id` and `status` >= ?) >= 1 or `payment_method` = ?) 

Спасибо!

ответ

2

Это, безусловно, правильный подход Laravel для построения этого запроса. Это почти всегда генерирует довольно прилично оптимизированный запрос, как правило, LEFT JOIN или подзапрос или их комбинацию.

Если вы хотите увидеть, насколько оптимальным будет результирующий запрос, добавьте ->toSql() в конец этого запроса и опубликуйте здесь синтаксис необработанного запроса.

+0

Спасибо за ваш ответ, я добавил синтаксис SQL к моему ответу ... Заставляет вас понять, насколько полезен Laravel :) – JohnWolf

+1

Я думаю, что построенный запрос довольно совершенен. Пока вы убедитесь, что индексируете столбцы, которые вы фильтруете, это будет здорово. –

+0

Да, я ... Спасибо за вашу любезную помощь. – JohnWolf

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