Laravel8 Eloquent关联查询 如何从关联表获取属性标题和属性值
解决步骤
1. 先给中间表模型AttributeValueToProducts添加关联
打开app/Models/AttributeValueToProducts.php,添加两个关联方法,注意类名要和你实际定义的模型名保持一致:
// 关联属性表 public function attribute() { return $this->belongsTo(Attribute::class, 'attribute_id', 'id'); } // 关联属性值表 public function attributeValue() { return $this->belongsTo(AttributeValue::class, 'attribute_value_id', 'id'); }
2. 查询时预加载嵌套关联
推荐用预加载的方式,性能更好,可以避免N+1查询问题,修改你的控制器查询代码:
$productData = Products::with('attributes.attribute', 'attributes.attributeValue') ->where('slug', $slug) ->first(); dd($productData->attributes);
这时候遍历$productData->attributes就能直接拿到对应字段:
foreach ($productData->attributes as $item) { // 输出属性名称 echo $item->attribute->title; // 输出属性值 echo $item->attributeValue->value; }
可选优化:扁平化返回字段
如果你不想每次都嵌套访问关联,可以直接在Products模型的关联方法里用join把需要的字段查出来,更适合列表页快速展示:
public function attributes() { return $this->hasMany(AttributeValueToProducts::class, 'product_id', 'id') ->join('attributes', 'attribute_values_to_products.attribute_id', '=', 'attributes.id') ->join('attribute_values', 'attribute_values_to_products.attribute_value_id', '=', 'attribute_values.id') ->select('attribute_values_to_products.*', 'attributes.title', 'attribute_values.value'); }
改完之后不需要嵌套访问,直接就能拿到字段:
foreach ($productData->attributes as $item) { echo $item->title; echo $item->value; }
内容的提问来源于stack exchange,提问作者Shailesh Jadav
相关产品推荐
相关产品推荐

