私は現在、2つのクエリ結果を1つのオブジェクトにマージする方法に固執しています。以下は私のコードです。
[〜#〜]編集済み[〜#〜]
モデルメソッド
public static function getTeamStats($competitionId, $teamId) {
return TeamCompetitionStatistics::where('competitionId', $competitionId)
->where('teamid', $teamId)
->where('periodNumber', 0)
->get();
}
public static function getTeamPosition($competitionId, $teamId){
return self::where('latest', 1)
->where('competitionId',$competitionId)
->where('competitorId', $teamId)
->get(['position', 'streak'])
->map(function($item, $key){
$item->position = $item->position . date("S", mktime(0, 0, 0, 0, $item->position, 0));
if(strpos($item->streak, '-') !== FALSE) {
$item->streak = str_replace('-', 'L', $item->streak);
}
else {
$item->streak = 'W'.$item->streak;
}
return $item;
});
}
コントローラで値を取得する
$teamStanding = Ladder::getTeamPosition($request->competitionId, $request->id);
$teamStatistics = TeamCompetitionStatistics::getTeamStats($request->competitionId, $request->id);
$result = $teamStatistics->merge($teamStanding);
返された結果:[{'teamstanding': 'data'}, {'teamstatictics': 'data'}]
期待される出力:[{'teamstanding': 'data', 'teamstatictics': 'data'}]
All()関数を使用できます。
$teamStanding = Ladder::getTeamPosition($request->competitionId, $request->id)->get();
$teamStatistics = TeamCompetitionStatistics::getTeamStats($request->competitionId, $request->id)->get();
$merged = $teamStatistics->merge($teamStanding);
$result = $merged->all();
// return [{'teamstanding': 'data', 'teamstatictics': 'data'}]
上記の解決策がうまくいかなかったので私の答えを追加すると、両方とも1つの配列に2つの別々のオブジェクトを追加しただけです:{"Name":"A Name"},{"Surname":"A Surname"}
。アレイを収集して最初に使用する必要がありました。
https://laravel.com/docs/5.4/collections#method-merge
$first = $modelone->where('Id', '1')->first(['Name']);
$second = $modeltwo->where('Thing', '1')->first(['Surname']);
$collection = collect($first);
$merged = $collection->merge($second);
$result[] = $merged->all();
return $result;
//output: [{"Name":"A Name","Surname":"A Surname"}]
merge()
を試してください
merge メソッドは、指定された配列またはコレクションを元のコレクションとマージします。
$first = ModelName::where('<fieldName>','<searchText>')
->get();
$second = Album::where('<fieldName>','<searchText>')
->get();
$finalResult = $first->merge($second);
$finalResult->each(function($record)
{
echo $record-><fieldName>.'<br />';
});
個人的には、Collectionsで2つの可能な大きなクエリを変換してマージするのが好きではないので、そこでは多くの処理が行われているようです。
私は通常union()を使用しますが、これは他の人を助けることができるかもしれません。 組合のLaravelドキュメント
$first = DB::table('users')
->whereNull('first_name');
$users = DB::table('users')
->whereNull('last_name')
->union($first)
->get();