如何将关联两表的原生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
相关产品推荐
相关产品推荐

