微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在 Laravel 中反转预先加载数据的结构

我正在 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",...
    ]
}

我期望得到的结构如下。

{
    "product_id": 1,"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 { }

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

我的表格如下

产品

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

product_attributes

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

attribute_values

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

属性

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

解决方法

如果我理解正确的话,您有产品和属性表和 product_atributes 作为产品和属性之间的中间表 并且它有 attribute_value 字段作为枢轴。

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

// 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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?