我在CakePHP中的查詢返回的數據對象的結構如下:更改結果的結構對象的CakePHP 3
[
{
"join_id": 1,
"contract_id": 1,
"title": "Title",
"sales": 500,
"earnings": 50,
"publisher": "Publisher",
"end_date": "2016-11-15"
},
{
"join_id": 2,
"contract_id": 1,
"title": "Title",
"sales": 500,
"earnings": 50,
"publisher": "Publisher",
"end_date": "2016-01-15"
},
{
"join_id": 3,
"contract_id": 2,
"title": "Title",
"sales": 500,
"earnings": 50,
"publisher": "Publisher",
"end_date": "2016-05-15"
}
]
我想要做的是改變結構,使其被分割contract_id
,以及某些有關其子場進行計算,這樣的:
[
{
"contract_id": 1,
"end_date": "2016-11-15",
"joins": [
{
"join_id": 1,
"title": "Title",
"sales": 500,
"earnings": 50,
"publisher": "Publisher",
"end_date": "2016-11-15"
},
{
"join_id": 2,
"title": "Title",
"sales": 500,
"earnings": 50,
"publisher": "Publisher",
"end_date": "2016-01-15"
}
]
},
{
"contract_id": 2,
"end_date": "2016-05-15",
"joins": [
{
"join_id": 3,
"title": "Title",
"sales": 500,
"earnings": 50,
"publisher": "Publisher",
"end_date": "2016-11-15"
}
]
}
]
綜上所述,我想按contract_id
的結果,並計算出它的所有兒童的最新end_date
。
我已經能夠使用MapReduce的度日contract_id
像這樣分組的結果:
$mapper = function ($contractstitle, $key, $mapReduce) {
$contract_id = $contractstitle->contract_id;
$mapReduce->emitIntermediate($contractstitle, $contract_id);
};
$reducer = function ($contractstitle, $contract_id, $mapReduce) {
$mapReduce->emit($contractstitle, $contract_id);
};
$query->mapReduce($mapper, $reducer);
但我無法弄清楚如何計算字段添加到它。我對mapReduce不是很熟悉 - 我想我需要遍歷數據才能獲得最大的價值,但我不知道如何去做。
我也看過formatResults
方法,但我不確定這是我應該使用的。
感謝,
KEZ
編輯 - 請求的信息:
我簡化了結構,結果在我最初的問題,因爲我花了很多時間試圖建立一個查詢,沒有無緣無故地結束多次循環。在Contracts中啓動查詢幷包含ContractsTitles會很好,但是ORM似乎並不那麼喜歡,所以在我看來,我的最佳選擇是在獲得所需的所有信息後重新調整結果。很顯然,我可以手動遍歷結果並構建我想要的數組,但是我覺得必須有更好的方法來完成此操作。
這是表所使用的基本結構:
ContractsTitles hasOne Reversions
ContractsTitles hasOne Publications
ContractsTitles belongsTo Contracts
ContractsTitles belongsTo Titles
ContractsTitles hasMany Royalties
而且這是在型號爲查詢代碼:
$subQuery = $this->Contracts->Royalties
->find()
->contain(['Contracts'])
->where(['Contracts.publisher_id' => $options['publisher_id']]);
$subQuery
->select(['contract_id' => 'Royalties.contract_id','title_id' => 'Royalties.title_id','sold' => $subQuery->func()->sum("sold"), 'earned' => $subQuery->func()->sum("earned")])
->group(['Royalties.title_id','Royalties.contract_id']);
$query = $this->Contracts->ContractsTitles
->find()
->select(['Contracts.id', 'Contracts.date', 'Titles.title', 'Reversions.date', 'Publications.date', 'sold' => 'r.sold', 'earned' => 'r.earned'])
->where(['Contracts.publisher_id' => $options['publisher_id']])
->contain(['Contracts','Titles','Reversions','Publications'])
->join([
'table' => $subQuery,
'alias' => 'r',
'type' => 'LEFT',
'conditions' => ['r.contract_id = ContractsTitles.contract_id','r.title_id = ContractsTitles.title_id']
])
->order(['Contracts.date DESC, Publications.date DESC']);
你能提供你的表結構和型號認定中? –
嗨Haresh,我已經更新了我的問題,但我不知道它會有多大的幫助! – Kez