如何在Laravel中反求预加载数据的结构
我急切地在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": [ {
$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我已经看到了您的表结构。对于多对多关系,您的实现是正确的。我认为你不能改变你的预期结构。