You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将关联两表的原生SQL查询转换为可运行的Laravel查询

原SQL报错原因

你编写的原始SQL在PhpMyAdmin中无法运行是因为反引号使用错误:你把表名和字段名放在了同一对反引号中,MySQL会把candidats.id整体识别为一个字段名,找不到对应字段就会报错。正确的字段引用格式应为candidats.id,表名和字段名分别用反引号包裹。

Laravel查询实现方案

你的需求是展示所有候选人数据,按关联的candidatures表的etat字段排序,分两种常见场景提供实现代码:

场景1:保留所有候选人(含没有申请记录的候选人),按申请的etat字段排序

使用leftJoin避免过滤掉无申请记录的候选人,实现代码如下:

$candidats = Candidat::select('candidats.*')
    ->leftJoin('candidatures', 'candidats.id', '=', 'candidatures.candidat_id')
    ->orderBy('candidatures.etat') // 如需倒序可改为 orderByDesc
    ->get();

场景2:一个候选人对应多条申请记录,按最新申请的etat排序

如果每个候选人有多条candidatures记录,你可以用子查询取最新的申请记录做排序:

$candidats = Candidat::select('candidats.*')
    ->leftJoin('candidatures', function ($join) {
        $join->on('candidats.id', '=', 'candidatures.candidat_id')
            ->whereRaw('candidatures.id = (SELECT MAX(id) FROM candidatures WHERE candidat_id = candidats.id)');
    })
    ->orderBy('candidatures.etat')
    ->get();

关联加载补充

如果你需要同时拿到候选人对应的所有申请数据,可以加上with方法预加载关联,避免N+1查询问题:

$candidats = Candidat::select('candidats.*')
    ->with('candidatures')
    ->leftJoin('candidatures', 'candidats.id', '=', 'candidatures.candidat_id')
    ->orderBy('candidatures.etat')
    ->get();

内容的提问来源于stack exchange,提问作者Jasmine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:12:03