Как из массива объектов удалить дублирующиеся объекты?
Обновлённый ответ.

1. Можешь все объекты преобразовать в массивы без поля ID. Далее просто использовать array_unique($collection, SORT_REGULAR);

2. Можешь определить метод __toString() у класса DonateOperation. Как-нибудь так:

public function __toString(): string
{
    $attrs = (array)$this;
    unset($attrs['id']);
    return json_encode($attrs);
}

Тогда array_unique будет работать применительно к исходной коллекции объектов.

3. Брут-форс в лоб. Самый долгий способ. С небольшой оптимизацией:

$collection = [...]; //исходная коллекция объектов
$found = []; //коллекция найденных массивов для быстрой проверки
$unique = []; //результирующая коллекция

foreach ($collection as $item) {
    //преобразуем объект в массив без поля "id"
    $array = (array)$item;
    unset($array['id']);
    
    //ищем полученный массив в массиве $found
    if (!in_array($array, $found)) {
        $found[] = $array;
        $unique[] = $item;
    }
}
Обновлённый ответ.

1. Можешь все объекты преобразовать в массивы без поля ID. Далее просто использовать array_unique($collection, SORT_REGULAR);

2. Можешь определить метод __toString() у класса DonateOperation. Как-нибудь так:

public function __toString(): string
{
    $attrs = (array)$this;
    unset($attrs['id']);
    return json_encode($attrs);
}

Тогда array_unique будет работать применительно к исходной коллекции объектов.

3. Брут-форс в лоб. Самый долгий способ. С небольшой оптимизацией:

$collection = [...]; //исходная коллекция объектов
$found = []; //коллекция найденных массивов для быстрой проверки
$unique = []; //результирующая коллекция

foreach ($collection as $item) {
    //преобразуем объект в массив без поля "id"
    $array = (array)$item;
    unset($array['id']);
    
    //ищем полученный массив в массиве $found
    if (!in_array($array, $found)) {
        $found[] = $array;
        $unique[] = $item;
    }
}