Добавление необработанного запроса к красноречивым отношениям - PullRequest
0 голосов
/ 16 сентября 2018

Я занимаюсь разработкой приложения в Laravel 5.6 У меня есть простая таблица со следующими столбцами:

company_id    project_id    company_role_id    company_specialisation_id

И это представляет модель AssociateCompanies, которая имеет отношение company, project, role, specialisation, теперь у меня есть какой-то запрос для получения атрибута:

$companies = AssociateCompany::whereHas('company', function ($q) use ($request) {
    $q->whereHas('projectOwners', function ($q) use($request) {
        $q->where('slug', $request->slug);
    });
})->groupBy('company_id', 'company_specialisation_id')->with('company', 'role', 'specialisation');

Я хочу собрать все уникальные поля с их счетами из двух столбцов company_id и specialisation_id, но groupBy не дает мне правильных результатов, поэтому я не могу продолжить:

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1055 Выражение №1 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец «conxn.project_associate_company.id», который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by (SQL: выберите * из project_associate_company там, где существует (выберите , (выберите количество () из project_associate_company, где companies. id = project_associate_company. company_id и project_associate_company. deleted_at равно нулю) как associated_projects_count из companies, где project_associate_company. company_id = companies. id и существует (выберите * из projects внутреннее соединение project_owner_relation на projects. id = project_owner_relation. project_id, где companies. id = project_owner_relation. company_id и slug = lodha-patel-estate-tower-ab-mumbai и projects. deleted_at равно нулю) и companies. deleted_at равно нулю) и project_associate_company. deleted_at равно нулю группы по company_id, company_specialisation_id) "

Итак, я попытался запустить необработанные запросы, например так:

$companies = AssociateCompany::whereHas('company', function ($q) use ($request) {
        $q->whereHas('projectOwners', function ($q) use($request) {
            $q->where('slug', $request->slug);
        });
    })->selectRaw(DB::raw('COUNT(*) AS count GROUP BY company_id , company_specialisation_id'))
    ->with('company', 'companyRole', 'specialisation')->get();

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL есть ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'GROUP BY company_id, company_specialisation_id из project_associate_company' в строке 1 (SQL: выберите COUNT (*) AS count GROUP BY company_id, company_specialisation_id из project_associate_company где существует (выберите , (выберите количество () из project_associate_company, где companies. id = project_associate_company. company_id и project_associate_company. deleted_at равно нулю) как associated_projects_count с companies, где project_associate_company. company_id = companies. id и существует (выберите * из projects внутреннее соединение project_owner_relation на projects. id = project_owner_relation. project_id где companies. id = project_owner_relation. company_id и slug = lodha-patel-estate-tower-ab-mumbai и projects. deleted_at равно нулю) и companies. deleted_at равно нулю) и project_associate_company. deleted_at равно нулю) "

Предложите мне лучший способ получить это. Спасибо.

1 Ответ

0 голосов
/ 16 сентября 2018

Изначально я хочу заметить, что вы не можете "группировать" внутри оператора "select".

Таким образом, вы не можете агрегировать неагрегированные столбцы. Это означает, что сгруппированные поля могут иметь несколько «ролей», поэтому вы не можете «загружать» «роли». Запрос должен быть похож на один из следующих:

AssociateCompany::whereHas('company', function ($q) use ($request) {
    $q->whereHas('projectOwners', function ($q) use($request) {
        $q->where('slug', $request->slug);
    });
})->select('company_id', 'company_specialisation_id', \DB::raw('COUNT(*) as cnt'))
->groupBy('company_id', 'company_specialisation_id')
->with('company', 'specialisation');

Или:

AssociateCompany::whereHas('company', function ($q) use ($request) {
    $q->whereHas('projectOwners', function ($q) use($request) {
        $q->where('slug', $request->slug);
    });
})->select('company_id', 'company_specialisation_id', 'company_role_id', \DB::raw('COUNT(*) as cnt'))
->groupBy('company_id', 'company_specialisation_id', 'company_role_id')
->with('company', 'specialisation', 'role');

Мои предложения такие, но я думаю, что вы можете решить их с помощью необработанных запросов MySQL, а не использовать их для Eloquent.

...