Artikel als Array

Ho!

da Oxid 6 ja Symfony nutzt, habe ich mir einen Plugin geschrieben, welches mir erlaubt mit composer install | update automatisch Bundles zu registrieren. Damit kann ich jetzt zusätzlich Routen definieren und eine API (REST-Api) schreiben.

Ich überlege gerade, wie ich am Besten die Daten wie z.B. alle Artikel als Array bekommen kann. In einem Model kann ja mit $Model->load() ein Artikel geladen werden, die Objekte sind aber viel zu Riesig, ein einfaches Array in dem nur die ‘oxarticles__’ Daten fertig formatiert enthalten sind, wäre mir lieber. Habt ihr da eine Idee oder bereits Erfahrungen gesammelt?

10 - 100 Artikel wären ja kein Problem, aber wie schaut es bei 1.000 - 20.000 Artikel aus, das würde vermutlich den Arbeitsspeicher grillen. Ein Limit wäre ja in dem Fall nur eine Symptombehandlung, kommt aber auf jeden Fall mit rein :slight_smile:

Ich danke schon mal, für eure Ideen.

LG
Sascha

man könnte ggf. alle unnötigen Performance-Schalter für die jeweilige Script-Ausführung ausschalten, z.B. das Laden von Herstellern, Tags, Suchbegriffen etc.
Alternativ habe ich Export Scripts gesehen, die eigene Artikellisten nur mit nötigen Dateien gebaut haben, etwa so:

$aDbArticles = $oDb->getArray("select felder, die, ich, will from oxarticles");
$aArticles = [];
foreach ( $aDbArticles as $aFelderAusDerDatenbank )  { 
    $aArticles[] = oxNew('Article')->assign($aFelderAusDerDatenbank); 
}

Ein Standardset an Feldern ist gut, damit dürfte ich das Object möglichst Arbeitsspeicherschonend laden können, evt. kann ich ja noch eine Option einfügen, die nur den Dump aus der Datenbank lädt, ich brauch nicht immer ein vollständig evaluiertes Object der Daten.

Du musst ja nicht direkt alle laden. Arbeite mit Limit und Offset und lade pro Durchgang die gewünschte Anzahl. Damit kannst undendlich viele Artikel verarbeiten, ohne den Speicher Speicher zu überlasten.

Ein Limit kommt auf jeden Fall rein.

Eine Funktion die einen Artikel einfach als Array ausgibt, gibt es vermutlich nicht, oder? Also Preise in denen schon Rabatte etc fertig berechnet sind.

Dazu kannst ja die Objekte laden und entsprechend dann auch die Preise:
Bsp:

…while (!$oRx->EOF) {
$oArticle = oxNew( “oxarticle” );
$oArticle->setLanguage( $xmllang );
$oArticle->load( $oRx->fields[‘oxid’] );
$bprice = $oArticle->getPrice()->getBruttoPrice();

Genau das möchte ich ja vermeiden, aber ich denke dass mir nichts anderes übrig bleibt. Ich schau mal ob es irgendwie möglich ist alternativ zu ->load() noch die Funktion ->fetch() hinzuzufügen die mir ein fertiges Array - und kein Objekt - zurück gibt.