推动对象集合将列别名绑定到外部 table 对象而不是将其取出

Propel object collection bind column alias to the foreign table object insted of getting it out

我有两个 db tables 一个是 Item 另一个 (Unit) 代表所有的度量单位可用于 Item table。在这种情况下 Item table 包含 Unit table 的外键,它充当一对多关系。

使用 Propel ORM,我可以像下面那样加入两个 table 并得到 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...
         }
      },
       ...

任何实现预期输出的建议都将是可观的。谢谢你。

UPDATE

如果我将代码更改为结果对象集合,则输出将为:

$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 对象中。

以下方法对我有用:

$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...
         }
      },
       ...