yakamara / yform

YForm für REDAXO 5 – Formulare im Frontend und Backend mit Verwaltung von Datenbank-Tabellen.
MIT License
77 stars 55 forks source link

Umwandlung Collection in Array - gibt es da was? #1065

Open christophboecker opened 3 years ago

christophboecker commented 3 years ago

Hallöchen, ich suchte eine Methode, um das Ergebnis einer YOrm-Collection komplett als Array zu bekommen. Mit $collection->toArray() wird zwar aus der Collection (oberste Ebene) ein Array, aber die Elemente im Array sind noch immer die Instanzen der Dataset-Klassen.

grafik

Gibt es eine Methode, die ich bisher übersehen habe, die so etwas liefern würde:

grafik

Oder sogar mit einer aus den Datensätzen abgegriffenen eindeutigen ID statt fortlaufender Numerierung

grafik
alxndr-w commented 3 years ago

Was wäre der Vorteil?

christophboecker commented 3 years ago

Ich könnte z.B. das Ergebnis als JSON versenden. json_encode($collection) führt jedenfalls nicht zum gewünschten Ergebnis. Vieleicht gibt es ja was passendes und ich finde es nur nicht, deshalb meine Frage.

alxndr-w commented 3 years ago

json_decode($collection, true); oder json_decode(array_values($collection)); probiert?

christophboecker commented 3 years ago

(Encode, nicht decode) Führt nicht zum gewünschten Ergebnis. Dann sind auch andere Felder mit drin, die da nix zu suchen haben und die Datensätze sind noch immer kein Array. Ich hab mir fix ne Funktion geschrieben.

tbaddade commented 3 years ago

@gharlan Was meinst du hierzu? Die Collection inklusive Datasets als Array oder so belassen wie es ist?

gharlan commented 3 years ago

Also einerseits sollten die Klassen vielleicht JsonSerializable implementieren, damit die direkte JSON-Umwandlung funktioniert.

Wahrscheinlich würde ich dann noch in der Query-Klasse eine Methode anbieten, die die Daten direkt als Array liefert, ohne überhaupt die Objekte zu erzeugen. Das ist auch hilfreich, wenn man mal nur paar (berechnete) Werte aus der DB will, und nicht die ganzen Objekte. Ob man dann auch noch eine Methode anbieten möchte, um eine Collection komplett in ein Array zu wandeln, weiß ich nicht.

Aktuell müsste es übrigens so klappen:

$array = array_map(fn (rex_yform_manager_dataset $dataset) => $dataset->getData(), $collection->toArray());
christophboecker commented 3 years ago

Das ist auch aktuell meine Lösung. Wobei ich noch einen draufgesattelt habe und optional ein Unique-Feld als Array-Key nehme :-)

gharlan commented 3 years ago

Dafür gibt es übrigens auch eine Hilfsmethode, $collection->toKeyIndex('my_field'), liefert aber dann ein Array von Dataset-Objekten. Die muss man also weiterhin umwandeln, wenn man reine Arrays will.