У меня две таблицы db, один - Item, а другой (Unit) представляет все единицы измерения, доступные для таблицы Item. В этом сценарии таблица элементов содержит внешний ключ таблицы Unit, который действует как отношение "один к большому".
С Propel ORM я могу присоединиться к обеим таблицам, как показано ниже, и получить результат json:
$items = ItemQuery::create()
->joinWith('Item.Unit')
->withColumn("CONCAT (Unit.Name,'-',Unit.Label)", "MUnit")
->find()
->toJSON();
Результатом вывода будет:
{
"Items":[
{
"Id":2,
"Code":"M000002",
"Name":"Item 1",
"Price":234,
"UnitId":1,
"Status":true,
"MUnit":"Kilograms-Kg",
"Unit":{
"Id":1,
"Name":"Kilograms",
"Label":"Kg",
"Status":true
}
},
{
"Id":3,
"Code":"M000003",
"Name":"Item 2",
"Price":100,
"UnitId":2,
"Status":true,
"MUnit":"Meter-Mt",
"Unit":{
"Id":2,
"Name":"Meter",
"Label":"Mt",
"Status":true
}
}
]
}
Как вы можете видеть, псевдоним столбца MUnit выходит из объекта unit в родительский объект. Но мне нужно только сохранить псевдоним внутри объекта Unit, как показано ниже.
...
"Items":[
{
"Id":2,
"Code":"M000002",
"Name":"Item 1",
"Price":234,
"UnitId":1,
"Status":true,
"Unit":{
"Id":1,
"Name":"Kilograms",
"Label":"Kg",
"Status":true,
"MUnit":"Kilograms-Kg",// here goes...
}
},
...
Любое предложение о достижении ожидаемого результата будет заметным. Спасибо.
ОБНОВИТЬ
Если я изменю свой код на результат сбора объектов, то вывод будет:
$items = ItemQuery::create()
->joinWith('Item.Unit')
->withColumn("CONCAT (Unit.Name,'-',Unit.Label)", "MUnit")
->find();
Выход:
...
#data: array:2 [▼
0 => Item {#323 ▼
#new: false
#deleted: false
#modifiedColumns: []
#virtualColumns: array:1 [▼
"MUnit" => "Kilograms-Kg" // <--- virtual column
]
#id: 2
#code: "M000002"
#name: "Item 1"
#price: 234.0
#unit_id: 1
#status: true
#aUnit: Unit {#324 ▼
#new: false
#deleted: false
#modifiedColumns: []
#virtualColumns: []
#id: 1
#name: "Kilograms"
#label: "Kg"
#status: true
#collItems: ObjectCollection {#325 }
#collItemsPartial: true
#alreadyInSave: false
#itemsScheduledForDeletion: null
}
...
Так что мне virtualColumn
нужно, чтобы получить virtualColumn
кулон MUnit в объект Unit.
Под моим подходом я работал:
$items = \ItemQuery::create()
->joinWith('Item.Unit')
->withColumn("CONCAT (Unit.Name,'-',Unit.Label)", "MUnit")
->find();
foreach ($items as $i) {
$i->getUnit()->setVirtualColumn('Asdf', $i->getVirtualColumn('MUnit'));
}
dd($items->toJSON());
Результат:
...
"Items":[
{
"Id":2,
"Code":"M000002",
"Name":"Item 1",
"Price":234,
"UnitId":1,
"MUnit":"Kilograms-Kg",
"Status":true,
"Unit":{
"Id":1,
"Name":"Kilograms",
"Label":"Kg",
"Status":true,
"Asdf":"Kilograms-Kg",// here goes...
}
},
...