如何在Laravel中反求预加载数据的结构

如何在Laravel中反求预加载数据的结构,laravel,collections,eloquent,Laravel,Collections,Eloquent,我急切地在Laravel中加载一个产品的关系数据 $product = Product::with('attributeValues.attribute')->find($id)->get(); 目前我得到的响应结构如下 { "product_id": 1, "product_name": "Shirt A", "attribute_values": [ {

我急切地在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"
                }
            ]
        },
        ...
    ]
}
我希望得到的结构如下

{
    "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 { }
目前,通过使用产品和使用原始查询分别获取其属性,我成功地获得了正确的结构。我正试图以一种雄辩的方式完成这项任务

我的表格如下

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 { }
产品

+----+------+
| id | name |
+----+------+
+----+------------+--------------------+
| id | product_id | attribute_value_id |
+----+------------+--------------------+
+----+--------------+-------+
| id | attribute_id | value |
+----+--------------+-------+
+----+-----------+
| id | attribute |
+----+-----------+
产品属性

+----+------+
| id | name |
+----+------+
+----+------------+--------------------+
| id | product_id | attribute_value_id |
+----+------------+--------------------+
+----+--------------+-------+
| id | attribute_id | value |
+----+--------------+-------+
+----+-----------+
| id | attribute |
+----+-----------+
属性值

+----+------+
| id | name |
+----+------+
+----+------------+--------------------+
| id | product_id | attribute_value_id |
+----+------------+--------------------+
+----+--------------+-------+
| id | attribute_id | value |
+----+--------------+-------+
+----+-----------+
| id | attribute |
+----+-----------+
属性

+----+------+
| id | name |
+----+------+
+----+------------+--------------------+
| id | product_id | attribute_value_id |
+----+------------+--------------------+
+----+--------------+-------+
| id | attribute_id | value |
+----+--------------+-------+
+----+-----------+
| id | attribute |
+----+-----------+

如果我理解正确,您有产品和属性表以及产品属性作为产品和属性之间的中间表 它以属性值字段作为轴心

然后,在产品模型中,您应该与具有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;
}

你好我也用表格更新了这个问题。我试过你的解决办法。但我没有工作。给我这个错误。SQLSTATE[42S22]:未找到列:1054未知列“product_attributes.attribute_id”@camile我已经看到了您的表结构。对于多对多关系,您的实现是正确的。我认为你不能改变你的预期结构。