Eloquent подзапрос был изменен в производном запросе - PullRequest
0 голосов
/ 29 мая 2019

У меня есть запрос 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 в обратном порядке, то последующее ничего не даст.

Я не хочу повторять запрос только для применения разных фильтров. Где я неправ? Пожалуйста, помогите.

1 Ответ

0 голосов
/ 29 мая 2019

Основано на моем понимании источника Laravel Query Builder от Github .

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...