【问题标题】:How to inverse the structure of eager loaded data in Laravel如何在 Laravel 中反转预加载数据的结构
【发布时间】:2021-06-05 11:08:10
【问题描述】:

我正在用 Laravel 中的关系数据急切地加载一个产品。

$product = Product::with('attributeValues.attribute')->find($id)->get();

目前我得到的响应结构如下。

{
    "product_id": 1,
    "product_name": "Shirt A",
    "attribute_values": [
        {
            "attribute_value_id": 1,
            "attribute_value": "small",
            "attribute": {
                "attribute_id": 1,
                "attribute": "size"
            }
        },
        {
            "attribute_value_id": 1,
            "attribute_value": "medium",
            "attribute": {
                "attribute_id": 1,
                "attribute": "size"
            }
        },
        ...
    ]
}

我期望得到的结构如下。

{
    "product_id": 1,
    "product_name": "Shirt A",
    "attribute": [
        {
            "attribute_id": 1,
            "attribute": "size",
            "attribute_values": [
                {
                    "attribute_value_id": 1,
                    "attribute_value": "small"
                },
                {
                    "attribute_value_id": 1,
                    "attribute_value": "medium"
                }
            ]
        },
        ...
    ]
}

目前模型的关系如下

class Product extends Model {
    public function attributeValues(){
        return $this->belongsToMany(AttributeValue::class, 'product_attributes');
    }
}

class AttributeValue extends Model {
    public function attribute(){
        return $this->belongsTo(Attribute::class);
    }
}

class Attribute extends Model { }

目前,通过使用产品并使用原始查询分别获取其属性,我成功地正确获取了此结构。我正在尝试以一种 Eloquent 的方式来完成这项任务。

我的表如下

产品

+----+------+
| id | name |
+----+------+

产品属性

+----+------------+--------------------+
| id | product_id | attribute_value_id |
+----+------------+--------------------+

属性值

+----+--------------+-------+
| id | attribute_id | value |
+----+--------------+-------+

属性

+----+-----------+
| id | attribute |
+----+-----------+

【问题讨论】:

    标签: laravel collections eloquent


    【解决方案1】:

    如果我理解正确,您将产品和属性表和 product_attributes 作为产品和属性之间的中间表 它有attribute_value字段作为pivot。

    那么在您的产品模型中,您应该与带有枢轴的属性模型建立多对多关系。

    // Product
    public function attributes()
    {
        return $this->belongsToMany(Attribute::class, 'product_attributes')
            ->withPivot('attribute_value');
    }
    

    通过这种方式,您可以获得产品的属性及其枢轴值。

    $product = Product::find($id);
    $product->load('attributes'); // same as with() in query builder
    

    当您需要枢轴值时,您可以通过->pivot->value 访问它

    foreach($product->attributes as $attribute) {
        echo $attribute->pivot->attribute_value;
    }
    

    【讨论】:

    • 嗨。我也用表格更新了问题。我试过你的解决方案。但是id没有用。给我这个错误。 SQLSTATE [42S22]:找不到列:1054 未知列 'product_attributes.attribute_id'
    • @Camille 我看过你的表结构。您的实现与多对多关系是正确的。我认为您无法更改为预期的结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 2022-07-26
    • 2021-04-03
    相关资源
    最近更新 更多