Laravel关联查询按关联表startup_date排序报错求助
问题原因
你用orderBy('info.startup_date')报错是因为with('info')属于延迟加载——Eloquent会先单独查询users表,再批量拉取关联的user_info数据。主查询阶段数据库里根本不存在info.startup_date这个字段,自然会提示“列未找到”。
解决方案
方案1:使用JOIN关联表(推荐)
直接关联两张表,就能直接用关联表字段排序:
$response = EloquentUser::join('user_info', 'users.id', '=', 'user_info.user_id') // 按需选择字段,避免两张表的id字段重复冲突 ->select('users.*', 'user_info.store_name', 'user_info.startup_date') ->orderBy('user_info.startup_date') ->get();
如果只需要users表的原始数据,写select('users.*')即可,不影响排序逻辑。
方案2:用子查询实现排序
不想用JOIN的话,可通过子查询获取每个用户对应的startup_date来排序:
$response = EloquentUser::has('info') ->orderByRaw('(SELECT startup_date FROM user_info WHERE user_info.user_id = users.id)') ->with('info') ->get();
这种方式适合需要保留Eloquent关联模型结构,同时基于关联字段排序的场景。
内容的提问来源于stack exchange,提问作者Tarika
相关产品推荐
相关产品推荐

