2016-06-29 35 views
0

我在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']); 
+0

你能提供你的表結構和型號認定中? –

+0

嗨Haresh,我已經更新了我的問題,但我不知道它會有多大的幫助! – Kez

回答