web-dev-qa-db-ja.com

Laravelコレクションを使用して、重複する値を取得します

重複する値を削除したくありません。articles_idの重複を取得し、それらの数量値を合計したいと思います。たとえば、これは私のコレクションです。

Collection {#306 ▼
  #items: array:3 [▼
    0 => CartLine {#294 ▼
      +quantity: 2
      +article_id: 1728
      +article_name: "TAZA CERAMICA"
    }
    1 => CartLine {#296 ▼
      +parent_line_id: null
      +quantity: 1
      +article_id: 1728
      +article_name: "TAZA CERAMICA"
    }
    2 => CartLine {#298 ▼
      +quantity: 1
      +article_id: 1378
      +article_name: "JARRA CERVEZA ALEMANA"

    }
  ]
}

そして、私はこの結果を得たいです:

Collection {#306 ▼
  #items: array:3 [▼
    0 => CartLine {#294 ▼
      +quantity: 3 //sum total quantity of the duplicates elements with same article_id
      +article_id: 1728
      +article_name: "TAZA CERAMICA"
    }
    1 => CartLine {#296 ▼
      +parent_line_id: null
      +quantity: 3
      +article_id: 1728
      +article_name: "TAZA CERAMICA"
    }
    2 => CartLine {#298 ▼
      +quantity: 1
      +article_id: 1378
      +article_name: "JARRA CERVEZA ALEMANA"

    }
  ]
}

重複する要素の数量を合計し、これらの要素の合計を使用して数量プロパティを設定します。

5
Antonio Morales

次のようなことを試すことができます。

$collection->groupBy('article_id')->flatMap(function ($items) {

    $quantity = $items->sum('quantity');

    return $items->map(function ($item) use ($quantity) {

        $item->quantity = $quantity;

        return $item;

    });

});

明らかに、$collectionを、コレクションを保持する変数と呼んでいるものに変更します。

お役に立てれば!

6
Rwd

私はこの答えがすでに受け入れられていることを知っていますが、同じものを探していたときにこのStackOverflowの投稿を見つけました。私がやったことは次のとおりでした。

$users = Users::all();
$usersUnique = $users->unique('id');
$usersDupes = $users->diff($usersUnique);

dd($users, $usersUnique, $usersDupes);

私は一度だけ必要だったので、本番ページで使用する必要がある場合、これがどれほどパフォーマンスが高いかはわかりません。

8

グループ化された複製を取得するためのもう1つの解決策:

    $collection = collect([
        [
            'name' => 'aa',
            'value' => 22
        ],
        [
            'name' => 'bb',
            'value' => 22
        ],
        [
            'name' => 'cc',
            'value' => 11
        ],
        [
            'name' => 'bb',
            'value' => 33
        ],
        [
            'name' => 'bb',
            'value' => 33
        ],
        [
            'name' => 'bb',
            'value' => 33
        ],
    ]);

    $groupedByValue = $collection->groupBy('value');

    $dupes = $groupedByValue->filter(function (Collection $groups) {
        return $groups->count() > 1;
    });

出力:

array:2 [▼
  22 => array:2 [▼
    0 => array:2 [▼
      "name" => "aa"
      "value" => 22
    ]
    1 => array:2 [▼
      "name" => "bb"
      "value" => 22
    ]
  ]
  33 => array:3 [▼
    0 => array:2 [▼
      "name" => "bb"
      "value" => 33
    ]
    1 => array:2 [▼
      "name" => "bb"
      "value" => 33
    ]
    2 => array:2 [▼
      "name" => "bb"
      "value" => 33
    ]
  ]
]
3
Alexandr Mityuk