如何解决如何在 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 举报,一经查实,本站将立刻删除。