web-dev-qa-db-fra.com

Requête de base de données en sortie deux fois

J'ai la requête de base de données suivante:

    $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();

J'appelle cela en HTML en utilisant:

    <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>

Cela fonctionne très bien, mais je reçois deux fois la sortie de chaque article. Des idées où je vais mal?

1
RustyJoomla

Vous obtenez probablement des éléments en double en raison de la jointure de la table des catégories. Et puisque vous ne sélectionnez rien dans le tableau des catégories, pourquoi ne pas simplement procéder ainsi:

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

Il semble également que vous utilisiez un identifiant pour limiter les données, mais cela n’a pas vraiment de sens puisque vous l’utilisez dans la jointure sans faire référence à aucune des colonnes categories. (Comme une supposition aléatoire, sont leurs deux catégories en ce moment?)

Donc si vous voulez réellement limiter par l'id, vous voulez probablement une clause 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

Pour adopter pleinement les méthodes de Joomla Query Builder ET exploiter les index de lignes de l'ensemble de résultats pour présenter le compteur, voici l'extrait suggéré ...

$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();

Bien que SOURCE soit un mot clé MySQL, ce n'est pas un mot clé RESERVED, il n'a donc pas besoin d'être encapsulé dans des backticks. D'ailleurs, aucune des colonnes n'a besoin de $db->quoteName() appliquée; de même avec le nom de la table.

Puisqu'une seule table est référencée, un alias de table n'est pas nécessaire.

Le code affichant les données pourrait s’écrit comme ceci:

<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>

Ou sans rebondir à plusieurs reprises si 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