Yii 2 Active Record вложил много ко многим отношениям

У меня есть 4 таблицы продуктов, свойства, property_items, property_product с отношениями, как это
Продукт имеет много свойств.
Недвижимость имеет много property_items.
Продукт имеет много property_items.
Property_product является промежуточной таблицей.

-- products --
Id   name
1   Arrabiata
2   Bolognese

--properties --
Id   name
1   Pasta type
2   Size

-- property_items --
Id   name                   value      property_id
1    Spinach spaghetti      .....      1
2    Linguine               .....      1
3    Spaghetti              .....      1
4    Small                  ....       2
5    Medium                 ....       2
6    Large                  ...        2

-- property_product  --
product_id    property_id  property_item_id
1             1              1
1             1              2
1             2              4
1             2              6
2             1              2
2             1              3
2             2              5

Я пытаюсь использовать Gii для создания этих моделей с отношениями.

class Products extends \yii\db\ActiveRecord
{
//code
....

public function getProperties()
{
return $this->hasMany(Properties::className(), ['id' => 'property_id'])
->viaTable('property_product', ['product_id' => 'id']);
}
}

class Properties extends \yii\db\ActiveRecord
{
//code
...

public function getPropertyItems()
{
return $this->hasMany(PropertyItems::className(), ['property_id' => 'id']);
}
}

Я хочу запросить данные с несколькими вложенными отношениями.
Как я могу создать ответ JSON с нижеуказанным форматом в одном запросе активной записи?

[
{
"id": "1",
"name": "Arrabiata",
"properties": [
{
"id": "1",
"name": "Pasta type",
"property_items" : [
{
"id": "1",
"name": "Spinach spaghetti",
},
{
"id": "2",
"name": "Linguine",
},
]
},
{
"id": "2",
"name": "Size",
"property_items" : [
{
"id": "4",
"name": "Small",
},
{
"id": "6",
"name": "Large",
},
]
},
],
},
{
"id": "2",
"name": "Bolognese",
"properties": [
{
"id": "1",
"name": "Pasta type",
"property_items" : [
{
"id": "2",
"name": "Linguine",
},
{
"id": "3",
"name": "Spaghetti",
},
]
},
{
"id": "2",
"name": "Size",
"property_items" : [
{
"id": "5",
"name": "Medium",
},
]
},
]
}]

Я использую этот запрос, но это заняло слишком много времени

Menus::find()->with(['products' => function ($query) {
$query->with(['properties']);
}])
->where(['>', 'status', 0])
->andWhere(['resid' => $id])->asArray()->all();;
foreach ($menus as &$menu) {
foreach ($menu['products'] as &$product) {
foreach ($product['properties'] as &$property) {
$propertyItems = PropertyItems::find()->where(['property_id' => $property['id']]
)
->leftJoin('property_product', 'property_items.id = property_product.property_item_id')
->where(['property_product.product_id' => $product['id'],
'property_product.property_id' => $property['id']])
->asArray()->all();
$property['propertyItems'] = $propertyItems;
}
}
}

Если я использую этот запрос

Menus::find()->with(['products' => function ($query) {
$query->with(['properties' => function ($query) {
$query->with(['propertyItems']);
}
]);
}
])->asArray()->all();

Но результат не такой, как я ожидал, потому что все property_items будут отображаться в свойствах, а не зависеть от связи с продуктами через таблицу «property_product»

[
{
"id": "1",
"name": "Arrabiata",
"properties": [
{
"id": "1",
"name": "Pasta type",
"property_items" : [
{
"id": "1",
"name": "Spinach spaghetti",
},
{
"id": "2",
"name": "Linguine",
},
{
"id": "3",
"name": "Spaghetti",
},
]
},
{
"id": "2",
"name": "Size",
"property_items" : [
{
"id": "4",
"name": "Small",
},
{
"id": "6",
"name": "Large",
},
{
"id": "5",
"name": "Medium",
},
]
},
],
},
{
"id": "2",
"name": "Bolognese",
"properties": [
{
"id": "1",
"name": "Pasta type",
"property_items" : [
{
"id": "1",
"name": "Spinach spaghetti",
},
{
"id": "2",
"name": "Linguine",
},
{
"id": "3",
"name": "Spaghetti",
},
]
},
{
"id": "2",
"name": "Size",
"property_items" : [
{
"id": "4",
"name": "Small",
},
{
"id": "6",
"name": "Large",
},
{
"id": "5",
"name": "Medium",
},
]
}
]
}]

Заранее спасибо.

0

Решение

Вы должны переопределить функцию fields() из Products а также Properties моделей.

например:

class Products extends ActiveRecord {

function fields(){
return ['properties'];
}
}class Properties extends ActiveRecord {

function fields(){
return ['property_items'];
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]