it-swarm-es.tech

Consulta de base de datos que sale dos veces

Tengo la siguiente consulta de base de datos:

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

Llamo a esto en 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>

Funciona muy bien, pero obtengo el resultado de cada elemento dos veces. ¿Alguna idea de dónde voy mal?

1
RustyJoomla

Es probable que obtenga elementos duplicados debido a la unión de la tabla de categorías. Y dado que en realidad no selecciona nada de la tabla de categorías, ¿por qué no hacer esto?

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

También parece que podría tener una identificación que está utilizando para limitar los datos, pero realmente no tiene sentido ya que la está utilizando en la unión pero no hace referencia a ninguna de las columnas categories. (Como una suposición aleatoria, ¿son sus dos categorías en este momento?)

Entonces, si realmente desea limitar por la identificación, probablemente quiera una cláusula 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

Para adoptar completamente los métodos de Joomla Query Builder Y aprovechar los índices de filas del conjunto de resultados para presentar el contador, aquí está mi fragmento sugerido ...

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

Si bien SOURCE es una palabra clave de MySQL, no es una palabra clave RESERVADA, por lo que no es necesario incluirla en comillas inversas. Por lo demás, ninguna de las columnas necesita $db->quoteName() aplicada a ellas; Del mismo modo con el nombre de la tabla.

Como solo se hace referencia a una tabla, no es necesario un alias de tabla.

El código que muestra los datos podría se escribiría así:

<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 sin rebotar repetidamente dentro y fuera 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