Laravel模型自定义主键后查询仍自动附加order by id问题解决
解决Laravel模型自定义主键后自动排序
id报错的问题 问题场景
已将Members表的member_id设为主键,并在Member模型中完成配置:
class Member extends Model { use HasFactory; public $timestamps = false; /** * The primary key for the model. * * @var string */ protected $primaryKey = 'member_id'; /** * The "type" of the auto-incrementing ID. * * @var string */ protected $keyType = 'string'; public $incrementing = false; }
但执行Member::query()时,SQL语句会自动附加order by id asc,导致「未知列id」错误,手动指定排序也无效。
解决方法
排查全局作用域与查询范围
检查项目的AppServiceProvider的boot方法,或者Member模型内的查询范围(scope开头的方法),是否存在强制添加orderBy('id')的逻辑。如果有,将排序字段替换为member_id即可。在模型中设置默认排序规则
在Member模型的boot方法中添加全局作用域,指定默认排序字段为member_id,覆盖框架默认的id排序:protected static function boot() { parent::boot(); static::addGlobalScope('default_order', function ($query) { $query->orderBy('member_id', 'asc'); }); }配置后,所有默认查询都会使用
member_id排序,不再生成基于id的排序语句。临时取消默认排序
若个别查询不需要默认排序,可使用withoutGlobalScopes方法移除全局作用域:// 移除所有全局作用域 Member::withoutGlobalScopes()->get(); // 仅移除指定的排序作用域 Member::withoutGlobalScope('default_order')->get();检查第三方扩展包
若项目使用了数据表格、查询增强类等第三方包,检查这类包的配置项,是否存在默认按id排序的设置,将其修改为member_id即可。
内容的提问来源于stack exchange,提问作者Veer
相关产品推荐
相关产品推荐

