У меня есть запрос Eloquent, в котором я объединяю несколько таблиц, а затем применяю разные фильтры к этому запросу, но после одного фильтра исходный подзапрос был изменен с помощью первого фильтра в другом фильтре.
это исходный запрос:
$circle = DB::table('circles')
->joinSub($member, 'member', function ($join) {
$join->on('circles.id', '=', 'member.circle_id');
})->joinSub($place, 'place', function ($join) {
$join->on('circles.place_id', '=', 'place.placeID');
})->joinSub($dep, 'dep', function ($join) {
$join->on('department_id', '=', 'depID');
})->where('use_classification', UseClassificationEnum::USES)
->select('id', 'circle_name', 'circle_code', 'department_name', 'place_name', 'numMem', 'leader');
затем применяйте различные фильтры
$current_circle = session('circle.id');
$circle_active = $circle->where('id', $current_circle)->first();
$circle_other = $circle->where('id', '<>', $current_circle)->get();
В запросе $circle_other
исходный $circle
был включен в where('id', $current_circle)
, поэтому он ничего не дает.
Если я поставлю $circle_active
и $circle_other
в обратном порядке, то последнее ничего не даст.
Я не хочу повторять запрос только для применения разных фильтров. Где я ошибся? Пожалуйста помоги.
@pal Я использую их все в своей функции контроллера, они перейдут в другую часть представления.
Основываясь на моем понимании источника Laravel Query Builder от Гитхаб.
where()
создает запрос в экземпляре $circle
для вашего запроса $circle_active
, поэтому он отражается в $circle_other
.
Что вы можете сделать в этой ситуации, так это создать такого помощника.
public static function buildCircleQuery() {
return DB::table('circles')
->joinSub($member, 'member', function ($join) {
$join->on('circles.id', '=', 'member.circle_id');
})->joinSub($place, 'place', function ($join) {
$join->on('circles.place_id', '=', 'place.placeID');
})->joinSub($dep, 'dep', function ($join) {
$join->on('department_id', '=', 'depID');
})->where('use_classification', UseClassificationEnum::USES)
->select('id', 'circle_name', 'circle_code', 'department_name',
'place_name', 'numMem', 'leader');
}
Тогда вы можете сделать это
// Note that Helper:: is based on your helper class name
$circle_active = Helper::buildCircleQuery()->where('id', $current_circle)->first();
$circle_other = Helper::buildCircleQuery()->where('id', '<>', $current_circle)->get();
Вы также можете клонировать запрос: $circle_active = (clone $circle)->where('id', $current_circle)->first();
@JonasStaudenmeir Это кажется короче. Я уже использовал вышеуказанный метод, но я буду иметь это в виду. Спасибо.
как вы определили, какой фильтр применяется?