我有两个数据库表,一个是项,另一个(单位)代表项表可用的所有度量单位。在此方案中,项表包含单元表的外键,该表用作一对多关系。
使用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对象中,如下所示。
...
"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
MUnit 纳入单元对象。
答案 0 :(得分:0)
以下方法对我有用:
$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...
}
},
...