Eloquent подзапрос был изменен в производном запросе

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

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

как вы определили, какой фильтр применяется?

Palak Jadav 29.05.2019 06:12

@pal Я использую их все в своей функции контроллера, они перейдут в другую часть представления.

vanq 29.05.2019 06:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
2
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на моем понимании источника 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();

Jonas Staudenmeir 29.05.2019 06:58

@JonasStaudenmeir Это кажется короче. Я уже использовал вышеуказанный метод, но я буду иметь это в виду. Спасибо.

vanq 29.05.2019 08:45

Другие вопросы по теме