Laravel 7中基于关联表筛选并展示产品的实现方法
筛选关联表符合条件的Laravel产品
嘿,作为Laravel开发者,这种关联数据筛选的需求非常常见,我给你适配Laravel 7的几种实现方案,你可以根据自己的场景选择:
1. 使用Eloquent关联(推荐,更符合Laravel的ORM风格)
首先确保你的Product模型已经和关联表建立了正确的关系:
// app/Product.php namespace App; use Illuminate\Database\Eloquent\Model; class Product extends Model { protected $table = 'products'; // 遵循命名规范可省略,明确写出更清晰 public function selectedFeatures() { // 关联selected_product_features表,对应模型为SelectedProductFeature return $this->hasMany(SelectedProductFeature::class); } }
然后用whereHas方法筛选出符合条件的产品:
// 在控制器或业务逻辑中 $filteredProducts = Product::whereHas('selectedFeatures', function ($query) { $query->where('key', 'form-2') ->where('description', 1); })->get();
whereHas的作用是检查当前产品是否存在满足闭包中条件的关联记录,完美适配你的需求。
如果需要同时获取符合条件的关联记录
如果你不仅要筛选产品,还要把对应的那条特征记录一起查出来,可以结合with方法:
$filteredProducts = Product::whereHas('selectedFeatures', function ($query) { $query->where('key', 'form-2') ->where('description', 1); })->with(['selectedFeatures' => function ($query) { $query->where('key', 'form-2') ->where('description', 1); }])->get();
这样返回的每个Product实例里,selectedFeatures属性只会包含符合key="form-2"且description=1的那条记录,而不是所有关联的特征。
2. 使用DB门面的JOIN查询
如果你更习惯原生SQL风格的查询,或者不需要Eloquent模型的便利,可以用DB门面写JOIN语句:
$filteredProducts = DB::table('products') ->join('selected_product_features', 'products.id', '=', 'selected_product_features.product_id') ->where('selected_product_features.key', 'form-2') ->where('selected_product_features.description', 1) ->select('products.*') // 只选择产品表的字段,避免字段冲突 ->distinct() // 防止同一个产品因为多条符合条件的关联记录被重复返回 ->get();
这里的distinct()很重要,因为如果一个产品有多个符合条件的特征记录,JOIN会返回多条重复的产品数据,加上它就能去重。
一些额外注意点
- 确保你的
SelectedProductFeature模型(如果使用Eloquent)的$table属性正确设置为selected_product_features,或者遵循Laravel的命名规则(模型单数,数据库表复数)。 - 如果需要分页,把
get()替换成paginate(15)(数字是每页显示的数量)即可。 - 你的迁移中
selected_product_features表设置了onDelete('cascade'),这意味着删除产品时对应的特征记录会自动删除,这个配置没问题。
内容的提问来源于stack exchange,提问作者operloa
相关产品推荐
相关产品推荐

