Laravel查询报错:where子句'id'列不存在,需按user_id筛选数据
解决Laravel中两个核心问题:筛选用户数据+主键不匹配报错
咱们一步一步来解决你遇到的问题,先搞定最紧急的SQL报错,再处理用户数据筛选的需求:
一、解决「Unknown column 'id' in 'where clause'」报错
这个报错的根源很直接:Laravel的模型默认会把id当作表的主键,但你的myroutes表用的是myroute_id作为主键,所以框架自动生成查询语句时用错了列名。
具体修复步骤:
- 修改模型的主键配置
找到对应myroutes表的模型(比如叫Myroute.php),添加一行代码指定自定义主键:class Myroute extends Model { // 指定表的主键为myroute_id protected $primaryKey = 'myroute_id'; // 如果你的myroute_id不是自增整数类型(比如字符串UUID),还要加上下面这行 // public $incrementing = false; } - 确保查询/路由绑定用对主键
- 如果是手动查询单条数据,现在可以直接用
find()方法,框架会自动用myroute_id去匹配:$myroute = Myroute::find($yourId); - 如果用了路由模型绑定(比如路由是
Route::get('/my-save/{myroute}', ...)),现在也能正常工作了,Laravel会自动用模型里定义的主键去匹配路由参数。
- 如果是手动查询单条数据,现在可以直接用
二、筛选当前登录用户的匹配数据
要确保只获取和当前登录用户user_id匹配的数据,有两种常用方法:
方法1:直接在查询中添加条件
在控制器的列表查询方法里,加上where条件过滤:
public function index() { // 获取当前登录用户的所有myroutes数据 $myroutes = Myroute::where('user_id', auth()->id())->get(); // 如果需要分页,改成paginate()即可 // $myroutes = Myroute::where('user_id', auth()->id())->paginate(10); return view('your-view-name', compact('myroutes')); }
方法2:用模型关联(更优雅的方式)
通过User模型和Myroute模型建立关联,后续调用会更简洁:
- 在User模型里定义关联
class User extends Model { // 一个用户对应多条myroute记录 public function myroutes() { return $this->hasMany(Myroute::class, 'user_id'); } } - 在控制器中获取关联数据
public function index() { // 直接通过当前登录用户获取关联的myroutes $myroutes = auth()->user()->myroutes; // 分页的话:auth()->user()->myroutes()->paginate(10); return view('your-view-name', compact('myroutes')); }
额外提醒:保护单条数据的访问权限
在访问单条数据的方法里,也要加上用户筛选,避免用户通过URL访问不属于自己的数据:
public function show($myrouteId) { // 只查询当前用户的这条myroute数据,找不到就返回404 $myroute = auth()->user()->myroutes()->findOrFail($myrouteId); return view('show-view', compact('myroute')); }
内容的提问来源于stack exchange,提问作者Just101
相关产品推荐
相关产品推荐

