Здравствуйте.
Суть такова. Имелся код под фреймворк Laravel, итог работы готорого была целая куча inner join. Вот сам код:
$this->product = $this->product->where(function ($query) use ($option, $value) {
$i = 0;
foreach($value as $single_value){
if($i == 0){
$query->whereHas('options', function($query) use($option, $single_value){
$query->where('name', $option)->where('value', $single_value);
});
} else {
$query->orWhereHas('options', function($query) use($option, $single_value){
$query->where('name', $option)->where('value', $single_value);
});
}
$i++;
}
});
Сделал маленькие изменения:
$this->product = $this->product->whereHas('options', function ($query) use ($option, $value) {
$i = 0;
foreach($value as $single_value){
if($i == 0){
$query->where(function($query) use($option, $single_value){
$query->where('name', $option)->where('value', $single_value);
});
} else {
$query->orWhere(function($query) use($option, $single_value){
$query->where('name', $option)->where('value', $single_value);
});
}
$i++;
}
});
Как итог - менее сложный код без лишних join'ов. Но скорость стала ниже.
Более того, все остальные запросы (связи Laravel и прочее) стали работать более секунды (!).
С чем связано такое поведение?
Как быть?
Возвращать Join-ы? Не думаю, что это лучшее решение, как минимум размер SQL кода меня смущает.
Хотелось более быструю работу - получилось наоборот.