代码之家  ›  专栏  ›  技术社区  ›  Nitish Kumar

向雄辩的关系添加原始查询

  •  0
  • Nitish Kumar  · 技术社区  · 7 年前

    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 没有给我正确的结果,所以我不愿意继续:

    project_associate_company 存在的位置(选择 ,(选择计数( )从 项目合作公司 companies . id = . 公司id 项目合作公司 . deleted_at 为空)为 associated_projects_count 公司 项目合作公司 公司id = 公司 身份证件 并且存在(从中选择* projects 内部连接 project_owner_relation . = . project_id 公司 . 身份证件 = . 公司id slug =lodha-patel-estate-tower-a-b-mumbai和 项目 . 已在删除\u 公司 . 项目合作公司 已在删除\u 公司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服务器版本对应的手册,以获取使用“groupbycompany\u id,company\u specialization\u id from”的正确语法 项目合作公司 '在第1行(SQL:select COUNT(*)AS COUNT GROUP BY company\u id,company\u specialization\u id from' 存在的位置(选择 ,(选择计数( )从 哪里 . 身份证件 . 公司id 项目合作公司 . 为空)为 公司 哪里 项目合作公司 . = 公司 身份证件 并且存在(从中选择* 项目 内部连接 项目所有者关系 . 身份证件 = 项目所有者关系 项目id 公司 . 身份证件 = . 公司id =lodha-patel-estate-tower-a-b-mumbai和 项目 已在删除\u 公司 . 已在删除\u 为空)并且 项目合作公司 . 已在删除\u “为空)”

    告诉我更好的方法。谢谢。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Mesuti    7 年前

    最初我想注意的是,您不能在“select”语句中使用“groupby”。

    因此不能聚合未聚合的列。这意味着分组字段可以有多个“角色”,所以你不能“加载”的“角色”。查询应类似于以下查询之一:

    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查询来解决它,而不是用它来雄辩。