Wie macht man eigene SQL-Abfragen in einem Admin-Modul

Hallo,

ich bin gerade dabei ein Modul für den Admin-Bereich zu schreiben. Dabei möchte ich gerne eine Liste von Artikelvarianten laden und dabei auch die Bezeichnung der Parent-Artikel gleich dazu.

in SQL sieht das dann so aus:

SELECT a.oxid, a.oxartnum
   (SELECT b.oxtitle 
   FROM oxarticles b 
   WHERE a.oxparentid = b.oxid) AS oxtitle, 
FROM oxarticles a 
WHERE ... 

im SQL-Edito klappt alles ganz prima, aber im Code

$rs = oxDb::getDb(true)->Execute( $sSql);
while (!$rs->EOF) {
   $oArticle = oxNew( "oxarticle" );
   $oArticle->load($rs->fields['oxid']);
    $rs->MoveNext();
}

verwendet OXID anscheinend nur die OXID und lädt die Felder selber, was dann dazu führt, dass die Felder OXTITLE etc. leer sind.

Kann mir da mal jemand weiterhelfen?

Grüße Joachim

P.S.: Wenn das Modul fertig ist, wird es auch wieder veröffentlicht.

Lass Dir mit

print_r($rs);

einfach ausgeben, was geladen wird. Dann siehst Du auch, wie Du ran kommst.

Danke, aber das habe ich schon gemacht.

Im $rs sind noch alle Werte da (so wie auch im SQL Browser).
Wenn es dann mit load() in $oArticle geladen wird, kommen nur noch die Werte des Variantenartikels an.

Ich vermute, dass die Routine load() die Daten nochmals selbst von der Datenbank mit einem eigenen SQL-Statement holt und dabei logischerweise die Parent-Werte leer sind.

Wenn die Werte vorhanden sind, kannst Du mit

$rs->fields['oxtitle']

rankommen. Ich würde mir überlegen, ob ich nicht einen anderen Namen für “AS oxtitle” wähle.

Danke für den Tipp, ich bin jetzt schon etwas weitergekommen. Mit

$oParentArticle = oxNew( "oxarticle" );
$oParentArticle->load($rs->fields['oxparentid']);
$oArticle->oxarticles__oxtitle = $oParentArticle->oxarticles__oxtitle;

komme ich an die Werte ran, aber dafür macht OXID für jede Variante ein neues Select und bei sehr vielen Artikeln läuft der Speicher über …

Ich werde es wohl auf die herkömmliche Art machen, in dem ich das Array an das Template übergebe, und auf die schöne Objektstruktur verzichten.

Nur den Wert ohne load():

$this->_wasweissich = $rs->fields['oxparentid'];

Vielen Dank für Deine Tipps. Letztendlich habe ich aber die (hoffentlich) bessere Lösung in eigenen/komplexen SQL-Statements gefunden, deren Ergebnis ich dann direkt an das Template übergebe.

Wer mehr erfahren möchte, hier
http://www.oxid-esales.com/forum/showthread.php?t=12176
habe ich gerade das neue Modul vorgestellt.

Achso:

$aArticles[] = $rs->fields; 

:wink:

[QUOTE=job963;73435]Vielen Dank für Deine Tipps. Letztendlich habe ich aber die (hoffentlich) bessere Lösung in eigenen/komplexen SQL-Statements gefunden, deren Ergebnis ich dann direkt an das Template übergebe.

Wer mehr erfahren möchte, hier
http://www.oxid-esales.com/forum/showthread.php?t=12176
habe ich gerade das neue Modul vorgestellt.[/QUOTE]

hallo,
ich hab mir deinen code (supersache! danke für dieses modul!) & die doku angesehen.
wie kann ich nach dem gleichen schema oxid-fremde, d.h. selbst in der oxid-db angelegte tabellen abfragen? ich bekomme einfach keine “verbindung” mittels

oxDb::getDb()

etc. oxid-eigene tabellen, auch mit erweiterten feldern, funktionieren - sowohl im BE als auch im FE…

oxid 4.5.5 CE

Was du von oxDb::getDb() zurück kriegst ist [B]keine[/B] MySQL Verbindungskennung sondern der ADODB Adapter. Mit dem kannst du dir Recordsets aufbauen:


$oDb = oxDb::getDb();
$rs = $oDb->Execute("SELECT oxusername FROM oxuser");
while(!$rs->EOF){
  echo $rs->fields[0] . "<br/>";
  $rs->MoveNext();
}

[QUOTE=aggrosoft;81489]


$oDb = oxDb::getDb();
$rs = $oDb->Execute("SELECT * FROM stone");
while(!$rs->EOF){
 echo $rs->fields[0]. " --> " . $rs->fields[1] . ", ";
  $rs->MoveNext();
}

[/QUOTE]
:slight_smile:
DANKE für den klärenden Hinweis!
so geht es. sogar (erstmal testweise) quick-n-dirty direkt im tpl (mit smarty {php}-tag drumherum)
als nächstes versuche ich mal diese tabellen bzw. abfrage mit oxarticles zu verbinden :rolleyes: