2015-03-09 2 views
0

Я строю запрос на таблицу (продукт).Более эффективный способ связывания запросов

продукт имеет внешний ключ, wrapper_id,

каждая обертка, в свою очередь, имеет внешний ключ wrapper_classification_id.

Эта часть запроса нуждается в изменении поиска на основе массива wrapper_classification_id, который может быть передан в качестве входных параметров.

Это то, что я делаю:

 // $query is already being built from above this line.... 
    // wrapper_classification_id in input is an array 

    if (Input::get('wrapper_classification_id')) 
    { 
     $wrappers = Wrapper::whereIn('wrapper_classification_id', Input::get('wrapper_classification_id'))->get(); 
     $wrapperArray = []; 
     foreach($wrappers as $wrapper) { 
      $wrapperArray[] = $wrapper->id; 
     } 
     $query->whereIn('wrapper_id', $wrapperArray); 
    } 

Есть ли более эффективный способ приближения к этому сценарию, где вы запрашиваете против значения в отношениях?

Спасибо заранее, Rich

ответ

1
$query->whereIn(
    'wrapper_id', 
    DB::raw(
     Wrapper::whereIn(
      'wrapper_classification_id', 
      Input::get('wrapper_classification_id') 
     )->toSql() 
    ) 
); 

Или попытка соединения.

$query->join('wrapper AS w', 'w.wrapper_classification_id', 'IN', Input::get('wrapper_classification_id')) 
    ->whereIn('product.wrapper_id', 'w.id'); 

Не уверен, что этот точный код будет работать.

1

Предполагая, что модель продукта имеет wrapper отношения:

if (Input::has('wrapper_classification_id')) 
{ 
    $query->whereHas('wrapper', function($q){ 
     $q->whereIn('wrapper_classification_id', Input::get('wrapper_classification_id')); 
    }); 
} 
Смежные вопросы