0

我有两个数据库表,一个是Item,另一个(Unit)代表Item表可用的所有度量单位。在这种情况下, 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 对象中,如下所示。

...

 "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放入Unit对象中。

4

1 回答 1

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...
         }
      },
       ...
于 2018-04-10T02:03:44.510 回答