Laravel中如何通过ID关联查询获取同分类商品?
嘿,我来帮你解决这个问题!你现在需要通过传入的商品ID,获取和它同分类的其他商品对吧?其实分两步就很清楚:先拿到当前商品所属的分类ID,再用这个ID筛选出同分类的商品(记得排除当前商品本身哦)。下面给你两种实现方式,适配不同的写法习惯:
方法一:使用Eloquent模型(推荐,更符合Laravel最佳实践)
首先确保你已经创建了Product和Category模型,并且在Product模型中定义好和分类的关联关系:
// app/Models/Product.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Product extends Model { // 假设你的商品表是products,分类表是categories,外键是category_id public function category() { return $this->belongsTo(Category::class); } }
然后在控制器方法中这样写:
public function details($id) { // 1. 获取当前商品,同时预加载分类关联,避免N+1查询问题 $product = Product::with('category')->findOrFail($id); // 2. 获取同分类的其他商品,排除当前商品本身,按需选择需要的字段 $relatedProducts = Product::where('category_id', $product->category_id) ->where('id', '!=', $id) ->select('id', 'name', 'description', 'image', 'price') // 这里可以补充你需要的其他字段 ->get(); // 将商品详情和相关商品传递到视图 return view('products.details', compact('product', 'relatedProducts')); }
方法二:使用DB门面(和你当前的写法风格一致)
如果你更习惯用原生查询的方式,也可以用DB门面来实现:
public function details($id) { // 1. 先查询当前商品的分类ID $categoryId = DB::table('products') ->where('id', $id) ->value('category_id'); // 2. 查询同分类的其他商品,排除当前商品 $relatedProducts = DB::select(' SELECT id, name, description, image, price FROM products WHERE category_id = ? AND id != ? ', [$categoryId, $id]); // 同时获取当前商品的详情(如果需要的话) $product = DB::select(' SELECT id, name, description, image, price, ... FROM products WHERE id = ? ', [$id])[0]; // 传递数据到视图 return view('products.details', compact('product', 'relatedProducts')); }
注意事项
- 如果你的商品表中关联分类的外键不是
category_id(比如是cat_id),记得把代码中的字段名替换成实际的名称 - 可以根据需求给相关商品添加排序条件,比如在查询链末尾加上
->orderBy('price', 'asc')或者->orderBy('created_at', 'desc') findOrFail()方法会在商品ID不存在时自动返回404页面,比普通的find()更适合详情页的场景
内容的提问来源于stack exchange,提问作者Hassaan Ali
相关产品推荐
相关产品推荐

