web-dev-qa-db-ja.com

Laravel 2つのクエリ結果を1つのオブジェクトにマージする方法

私は現在、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'}]

3
PenAndPapers

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'}]
19
Jakir Hossain

上記の解決策がうまくいかなかったので私の答えを追加すると、両方とも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"}]
4
Pat

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 />';
});
4
Hiren Makwana

個人的には、Collectionsで2つの可能な大きなクエリを変換してマージするのが好きではないので、そこでは多くの処理が行われているようです。

私は通常union()を使用しますが、これは他の人を助けることができるかもしれません。 組合のLaravelドキュメント

$first = DB::table('users')
        ->whereNull('first_name');

$users = DB::table('users')
        ->whereNull('last_name')
        ->union($first)
        ->get();
1
NinetyHH