Объединение вложенных таблиц с условиями в MySQL и Laravel - PullRequest
1 голос
/ 07 апреля 2020

Я создаю приложение на Laravel 7, где у меня есть следующие модели:

Компания (имя таблицы companies)

id      name             created_at
 1  Sample company 1   2018-09-17 17:47:03

Контракты (имя таблицы contract_awards)

id        name                 company_id  project_id   created_at
1   Sample Project involved        1            1     2018-09-17 17:47:03

Проект (имя таблицы projects)

id        name                  state          region
1      Sample Project 1       XYZ State      ABC Region

Категории

id    name
1     Residential
2     Commercial

Categories_projects_table

id   categories_id    project_id
1        2                   1

В настоящее время я выбираю компании и детали проекта, где в компаниях выбираются с собственными фильтрами / параметры и проекты выбираются с его собственными фильтрами / параметрами, я могу присоединиться к таблице проектов и получить результат согласно условию, но при применении фильтра категорий я не могу получить данные. Я не уверен, правильно ли я это делаю или нет, мой код выглядит следующим образом:

Company::leftjoin('contract_awards', function ($join) {
    $join->on('companies.id', '=', 'contract_awards.awarded_by');
})
->leftjoin('projects', function ($q) {
    $q->on('contract_awards.project_id', '=', 'projects.id')
    ->when(request('state'), function ($q) {
        $q->whereIn('state', collect(request('state')->pluck('id')));
    })
    ->when(request('region'), function ($q) {
        $q->whereIn('region', collect(request('region'))->pluck('id'));
    })
    ->when(request('categories'), function ($q) {
        $q->leftjoin('categories_projects_table', function($q) {
            $q->on('projects.id', '=', 'categories_projects_table.project_id');
        })
        // currently checking with static IDs later will be changed to collect(request('categories'))->pluck('id')
        ->select('categories_projects_table.categories_id as project_categories_id')
        ->whereIn('project_categories_id', [1]);
    });
})
->select('companies.*', 'projects.name as project_name', 'projects.area as project_area')
->paginate(15);

Я хочу сказать, что я хочу отфильтровать проекты с их отношением категории, приведенный выше код дает мне ошибку:

столбец не найден: 1054 Неизвестный столбец 'project_categories_id' в 'предложении' (SQL: выберите количество (*) как совокупность из companies левое соединение contract_awards на companies. `id .........

Любой лучший подход к выполнению этого приветствуется, спасибо заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...