it-swarm.dev

Query del database in uscita due volte

Ho la seguente query sul database:

    $database = JFactory::getDBO();
    $database->setQuery("SELECT items.headline, items.image, items.copy, items.source 
                FROM ms95f_createalist_items items
                JOIN ms95f_createalist_categories categories
                ON items.heading = " . $this->item->id);
    $orderitems = $database->loadObjectList();

Lo chiamo in html usando:

    <div class="feedList">
    <?php 
    $count = 0;
    foreach ($orderitems as $item) { ?>
        <div class="feedItem">
            <div class="number"> <?php echo $count; ?></div>
            <div class="headline"> <?php echo $item->headline; ?></div>
            <div class="image"> <?php echo $item->image; ?></div>
            <div class="copy"> <?php echo $item->copy; ?></div>
            <div class="source"> <?php echo $item->source; ?></div>
        </div>
        <?php $count++; } ?>
    </div>

Funziona benissimo, ma sto ottenendo l'output di ogni elemento due volte. Qualche idea su dove sbaglio?

1
RustyJoomla

Probabilmente stai ricevendo elementi duplicati a causa del join della tabella delle categorie. E poiché in realtà non selezioni nulla dalla tabella delle categorie, perché non farlo semplicemente:

$database->setQuery("SELECT items.headline, items.image, items.copy, items.source 
     FROM ms95f_createalist_items items");

Sembra anche che tu possa avere un ID che stai usando per limitare i dati, ma non ha molto senso dal momento che lo stai usando nel join ma non facendo riferimento a nessuna delle colonne categories. (Come un'ipotesi casuale, le loro due categorie sono in questo momento?)

Quindi, se vuoi effettivamente limitare con l'id, probabilmente vuoi effettivamente una clausola WHERE:

$database->setQuery("SELECT items.headline, items.image, items.copy, items.source 
     FROM ms95f_createalist_items items
     WHERE items.heading = " . $this->item->id");
4
David Fritsch

Per abbracciare completamente i metodi di Joomla Query Builder E sfruttare gli indici delle righe del set di risultati per presentare il contatore, ecco il mio frammento suggerito ...

$db = JFactory::getDBO();
$query = $db->getQuery(true)
    ->select(["headline", "image", "copy", "source"])
    ->from("#__createalist_items")
    ->where("heading = " . (int)$this->item->id);
$db->setQuery($query);
$orderitems = $db->loadObjectList();

Sebbene SOURCE sia una parola chiave MySQL, non è una parola chiave RISERVATA, pertanto non è necessario racchiuderla in backtick. Del resto, nessuna delle colonne necessita di $db->quoteName() applicato ad esse; allo stesso modo con il nome della tabella.

Poiché esiste solo una tabella a cui viene fatto riferimento, un alias di tabella non è necessario.

Il codice che mostra i dati potrebbe essere scritto in questo modo:

<div class="feedList">
    <?php 
    foreach ($orderitems as $index => $item) { ?>
        <div class="feedItem">
            <div class="number"> <?=($index + 1)?></div>
            <div class="headline"> <?=$item->headline?></div>
            <div class="image"> <?=$item->image?></div>
            <div class="copy"> <?=$item->copy?></div>
            <div class="source"> <?=$item->source?></div>
        </div>
        <?php
    } ?>
</div>

O senza ripetutamente rimbalzare dentro e fuori se php:

<div class="feedList">
    <?php 
    foreach ($orderitems as $index => $object) {
        echo "<div class=\"feedItem\">";
            echo "<div class=\"number\"> " , ($index + 1) , "</div>";
            foreach ($object as $prop => $val) {
                echo "<div class=\"{$prop}\"> {$val}</div>";
            }
        echo "</div>";
    } ?>
</div>
1
mickmackusa