You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 02:27:01