Laravel 9按标签和分类筛选数据时出现字段歧义错误
解决Laravel 9中标签筛选的字段歧义问题
你遇到的Column 'id' in where clause is ambiguous错误,核心原因是子查询同时涉及posts和tags两张表,两者都包含id字段,SQL无法判断你要匹配的是哪张表的id。从生成的SQL语句能看到,and id = 4这部分没有指定表名,导致字段歧义。
修复方案
只需要在标签筛选的子查询里,明确指定tags表的id字段即可,有两种简洁的实现方式:
方案一:直接指定表名
$posts = Post::when($categoryId > 0, function($query) use ($categoryId) { return $query->where('category_id', '=', $categoryId); }) ->when($tagId > 0, function($query) use ($tagId){ return $query->whereHas('tags', function($query) use ($tagId) { return $query->where('tags.id', $tagId); // 明确指定tags表的id字段 }); }) ->get(); return view('blog::posts.index', compact('posts', 'categories'));
方案二:使用whereKey方法
Laravel的whereKey方法会自动匹配当前查询模型的主键,这里子查询针对Tag模型,所以可以直接用:
$posts = Post::when($categoryId > 0, function($query) use ($categoryId) { return $query->where('category_id', '=', $categoryId); }) ->when($tagId > 0, function($query) use ($tagId){ return $query->whereHas('tags', function($query) use ($tagId) { return $query->whereKey($tagId); // 自动对应tags表的id主键 }); }) ->get(); return view('blog::posts.index', compact('posts', 'categories'));
内容的提问来源于stack exchange,提问作者Saeed Baboui
相关产品推荐
相关产品推荐

