Kalkulacja, operacje na kolekcjach

0

Encja

class Parameter extends Model
{
    protected $fillable = [
        'configuration_id', 'day', 'water', 'feed', 'weight', 'temperature',
    ];

}

przykładowe dane ( pomijajac configuration_id)
day | water | feed | weight | temperature
0 | 10 | 20 | 15 | 2.5 | 34
1 | 20 | 30 | 25 | 2.6 | 33
2 | 30 | 40 | 35 | 2.7 | 34
.
.
.
200 | 90 | 80 | 115 | 4.5 | 35

mając np. 200 parametrów należących do jakiejś tam konfiguracji potrzebuję wyświetlić wszystkie parametry ale w taki sposób aby wartości water, feed, weight były przesunięte o zadaną ilość do góry. Tzn. wyświetlam wszystkie dni 0 - 200 ale w wierszu day = 0 potrzebuję przypisać wartość np. water z day = 7, itd...
zastanawiam się czy stworzyć sobie jakiś DTO i je wypełnić czy kolekcję i na niej się bawić. To jest w Laravelu.

foreach($configuration->parameters as $parameter)
{
    // a może dwa razy przeiterować 
    // raz po całej konfiguracji
    // drugi raz po konfiguracji poczynając on danej dnia
    // wyniki obu przypisać do czegoś i na końcu scalić te kolekcje?
}

P.S. Gdzie w Laravelu trzymacie DTOsy, w sensie katalog, ścieżka

0

Chyba musisz trochę jaśniej napisać, bo nie do końca zrozumiałem. Np. dla wiersza z dnia drugiego 2 | 30 | 40 | 35 | 2.7 | 34 chcesz wyświetlić te wartości, ale parametr water chcesz mieć ją z dnia siódmego?

DTO trzymam albo w katalogu app/Dtos, jeżeli projekt jest malutki. Jeżeli jest większy, to możesz mieć podkatalog dla każdej domeny np. Security/Invoicing/Profile itd. i w tych katalogach podkatalog DTO. Możesz też w ogóle nie tworzyć katalogu DTO. Jak masz np. Invoicing, w którym masz klasy dotyczące faktur, to możesz mieć luzem klasę pod tytułem InvoiceData, InvoiceDto, czy po prostu Invoice w katalogu Invoicing.

Możesz też postarać się dobrać lepszą nazwę. Jeżeli masz np. klasę, która komunikuje się z jakimś api do faktur, to Twój dto, to tak naprawdę request, więc zamiast mieć katalog Invocing/Dtos możesz mieć Invoicing/Requests i AddInvoiceRequest. AddInvoiceRequest to pojemnik na dane, ale może sie nazywać sensowniej :P

0

@Desu: Nie do końca. Spójrz.
Mam kolekcję parametrów od 0-200 dnia ( full lista danych parametrów).
Mam też drugą kolekcję tych samych parametrów ale począwszy od dnia x ( x dostaję z zewn )
Teraz nie mam matchować wartości wg dni ale w taki sposób, że dzień 0 w pełnej kolekcji ma zostać wypełniony wartościami z dnia x np = 7 itd.... dzień 1 z dnia 8. Tak jakbym nałożył "obciętą" kolekcję na tą "full" ale zaczynając od początku ( nie po dniach ). na razie na brudno napisałem coś takiego co działa ok ( przepiszę to tylko ładniej ) ale mam kolejny problem

public function getDemandBalance($detailId)
    {
        $detail = $this->detailRepository->get($detailId);

        $configuration = $this->configurationRepository
            ->getBy('race_id', $detail->race->id)
            ->sortByDesc('date_from')
            ->first();


        $config           = $configuration->parameters; // to jest pełna konfiguracja
        $configFromDay    = collect();
        $configurationDto = collect();

        // config for herd_age -- obcięty konfig począwszy od dnia herd_age
        foreach($config as $parameter)
        {
            if($parameter->day < $detail->herd_age)
                continue;

            $configFromDay->push($parameter);
        }

        // all modified config
        foreach($config as $key => $parameter)
        {

            if($key <= $configFromDay->keys()->last())
            {
                $configurationDto->push(new ConfigurationDto([
                    'day'    => $parameter->day,
                    'water'  => $configFromDay[$key]->water,
                    'feed'   => $configFromDay[$key]->feed,
                    'weight' => $configFromDay[$key]->weight
                ]));
            }
            else{
                $configurationDto->push(new ConfigurationDto([
                    'day'    => $parameter->day,
                    'water'  => $parameter->water,
                    'feed'   => $parameter->feed,
                    'weight' => $parameter->weight
                ]));
            }
        }

        return $configurationDto;
    }

ogólnie tą metodę będę chciał odpalać w pętli. Uzyskam w ten sposób kolekcję

Collection {#489 ▼
  #items: array:2 [▼
    0 => Collection {#493 ▼
      #items: array:169 [▶]
    }
    1 => Collection {#1037 ▼
      #items: array:169 [▶]
    }
  ]
}

i teraz z tego chciałbym uzyskać jedną ale z zsumowanymi wartościami feed, water, weight dla danego dnia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1