Arrays vergelijken in Laravel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Liefhebber Laravel

Liefhebber Laravel

03/10/2017 15:56:10
Quote Anchor link
Hallo,

Ik bouw momenteel een order beheer systeem in Laravel 5.4. Daarvoor wil ik graag 2 arrays vergelijken:

De eerste array bevat een reeks kosten die aan een order zijn toegevoegd. (deze kan dus leeg zijn als het om een nieuw order gaat of als er nog geen kosten aangerekend zijn aan die order)
De gegevens komen als JSON veld uit de databank:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
[
    {"name": Kost standaard 1, "quantity": 1, "price": 120},
    {name: Kost manueel 1, quantity: 2, price: 120}
];


De tweede array bevat een standaard reeks kosten die ik uit mijn config bestand haal. (JSON)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
[
    {name: Kost standaard 1, quantity: 0, price: 120},
    {name: Kost standaard 2, quantity: 0, price: 40},
    {name: Kost standaard 3, quantity: 0, price: 10}
]


In mijn ‘OrdersController' wil ik dus een functie die, wanneer ik een order opbouw (nieuw of bestaand) er een collectie wordt gebouwd die deze beide vergelijkt.
Ik moet eigenlijk de tweede array (de standaard kosten) terugkrijgen als collectie waarin de nodige - reeds bestaande kosten al ingevuld worden EN waar de extra (manuele) kosten worden aangevuld.

Dus dit zou het resultaat moeten zijn:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
[
    {name: Kost standaard 1, quantity: 1, price: 120},  (< deze heeft als quantity 1 omdat dit zo in de eerste array ook is)
    {name: Kost standaard 2, quantity: 0, price: 40},
    {name: Kost standaard 3, quantity: 0, price: 10},
    {name: Kost manueel 1, quantity: 2, price: 120} (< deze is toegevoegd.)
]


Wie kan me helpen om deze functie te bouwen?

Bedankt!
Gewijzigd op 03/10/2017 15:56:47 door Liefhebber Laravel
 
PHP hulp

PHP hulp

18/04/2024 16:21:47
 
Rob Doemaarwat

Rob Doemaarwat

03/10/2017 17:45:44
Quote Anchor link
Als de name altijd uniek is zou ik die even als key van de arrays maken. Daarna kun je met array_merge() aan de slag.

Als je toch al in Laravel zit kun je deel 1 doen met Collection->keyBy('name') https://laravel.com/docs/5.5/collections#method-keyby . Deel 2 wordt dan Collection->merge(...).
 
Frank Nietbelangrijk

Frank Nietbelangrijk

03/10/2017 18:37:26
Quote Anchor link
Waarom werk je niet met een uniek (database) id in je array's? Dit ziet er niet heel erg consistent uit namelijk. Wat ik bedoel is: Hoe mot je applicatie weten of
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
{name: Kost standaard 1, quantity: 1, price: 120}

Het zelfde is als
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
{name: Kost standaard 1, quantity: 0, price: 120}


Eigenlijk kun je elke regel op een offerte of een factuur zien als een artikel. Desnoods maak je een artikel waarbij de gebruiker zelf de omschrijving EN de prijs kan invullen.

Je zou dan een tabel artikelen krijgen die allemaal hoe dan ook een uniek nummer hebben.
Vervolgens kun je een orderregel opbouwen met deze gegevens:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
artikel_id: verwijst naar het artikel
quantity: hoeveel


Totaalprijs per regel bereken je gewoon on de fly met $quantity * $artikel->price
Gewijzigd op 03/10/2017 18:38:44 door Frank Nietbelangrijk
 
Thomas van den Heuvel

Thomas van den Heuvel

03/10/2017 19:58:23
Quote Anchor link
Quantity 0 lijkt mij ook niet relevant? Waarvoor heb je die nodig?

Ook snap ik niet dat je gegevens in een database wilt spiegelen aan een config-bestand? De data in de database lijkt mij actueler?

Je hebt misschien wel uitgelegd wat je (programmatisch) wilt bereiken, maar niet waarom. Ook is niet duidelijk waar je uiteindelijk naartoe wilt, en waarom dit een juiste oplossing zou zijn.

Alleen al de identificatie op grond van naam doet mij vermoeden dat dit ofwel geen optimale aanpak is, of dat je een zeker (achterliggend) probleem (wat mogelijk de reden is voor deze kunstgreep?) op de verkeerde plek aan het oplossen bent. Het "probleem" is dus hier mogelijk niet het probleem, maar de aanpak van het (achterliggende) probleem.
Gewijzigd op 03/10/2017 19:59:13 door Thomas van den Heuvel
 
Liefhebber Laravel

Liefhebber Laravel

04/10/2017 10:19:42
Quote Anchor link
Even wat meer uitleg hierover.

Ik heb sowieso de tabellen 'orders' en 'orderlines'. De laatste bevat dan de verschillende artikelen in elke order (met een order_id als link, one-to-many relatie).

Op deze manier kan ik dus al de nodige producten uit de products-tabel koppelen aan de order. En ook kan ik zogenaamde vrije lijnen toevoegen (manuele omschrijving en prijs.

De kosten waarover ik in mijn post hierboven spreek, gaan echter over de montagekosten. Ik heb volgende velden in mijn tabel 'orders' die betrekking hebben op de montage:

  • assembly (Boolean 1 of 0 - duidt aan of er montage nodig is)
  • assembly_address_id (id gekoppeld aan customer_addresses tabel - waar moet de montage gebeuren)
  • assembly_relocation_cost (Float, bevat totaal verplaatsingskost - via Google API worden kilometers berekend)
  • assembly_costs (text, bevat JSON met oplijsting van de kosten: voorbeeld: [{"name": "Hoogtewerker per uur", "quantity": 1, "price": 120}, {"name": "Extra kost", "quantity": 1, "price": 50.5}])


De reden waarom ik deze gegevens als JSON bewaar in mijn tabel, is omdat deze (standaard) montagekosten later misschien veranderen. Als ik bijvoorbeeld een tabel zou hebben met 'assembly_costs' waarin deze opgelijst zijn, en ik maak een pivot tabel die de nodige kosten aan de order linkt, dan hebben we problemen als de order binnen een jaar geopend wordt, en een kost is in die tijdspanne veranderd. dan is de totale kost van die order anders.

Er zijn in ons bedrijf enkele standaard montagekosten die kunnen aangerekend worden (niet verplicht), zoals "Hoogtewerker per uur" en "Kleefwerk per uur". Omdat ik die al standaard in de montage-modal wil tonen in mijn order, had ik deze standaard kosten al in mijn config file gezet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
'order_assembly_costs' => [
        [
            'name' => 'Hoogtewerker per uur',
            'quantity' => 0,
            'price' => 120
        ],
        [
            'name' => 'Kleefwerk per uur',
            'quantity' => 0,
            'price' => 40
        ],
],


Deze worden dus ingelezen in de pagina wanneer de order getoond wordt.
De quantity 0 hierin bestaat omdat bij sommige montage-kosten het aantal al standaard moet ingevuld zijn wanneer een nieuwe order wordt geopend.

Hier een schermafbeelding van de standaard modal.

Maar als ik een reeds bestaand order wil openen, moeten deze beide arrays vergeleken worden om zo deze montage-modal in te vullen met de reeds bestaande gegevens

Hier een schermafbeelding van de reeds ingevulde modal

Zoals je in de tweede afbeelding ziet, zijn de standaard kosten daar reeds geplaatst, en zijn de nodige kosten (gevonden in de tabel) reeds aangevinkt en aangepast. Indien het om een extra kost gaat, wordt die onderaan bij aangevuld.

Ik hoop dat jullie hiermee meer info hebben, en zo mijn vraag een beetje kunnen plaatsen.

Indien een andere aanpak voor dit probleem mogelijk is, die misschien eenvoudiger is, dan is dit zeker welkom. Ik ben maar een simpele hobbyist :-)

Alvast bedankt!
 
Frank Nietbelangrijk

Frank Nietbelangrijk

04/10/2017 16:06:13
Quote Anchor link
>> De reden waarom ik deze gegevens als JSON bewaar in mijn tabel, is omdat deze (standaard) montagekosten later misschien veranderen.

a. voor ALLE artikelen geldt dat de prijs OOIT gaat veranderen. Denk aan de inflatie.
b. In geen geval is het een goed plan om JSON in je database op te slaan.

Als dit nog redelijkerwijs mogelijk is:

Sla de de regels van een offerte/factuur op in een aparte tabel waarbij je alle informatie zoals omschrijving artikelcode en prijs letterlijk kopieert uit de artikel tabel zodat je altijd een artikel kunt aanpassen zonder dat dit gevolgen heeft voor een offerte of factuur die reeds gemaakt is. Andersom kun je dan ook een offerte nog aanpassen (een factuur ligt wat gevoeliger) zonder dat je je artikelen gaat wijzigen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.