web-dev-qa-db-ja.com

2回出力されるデータベースクエリ

次のデータベースクエリがあります。

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

私はこれをhtmlで呼び出します:

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

うまく機能していますが、各項目の出力を2回取得しています。私が間違っているアイデアはありますか?

1
RustyJoomla

カテゴリテーブルが結合されているため、アイテムが重複している可能性があります。また、実際にはカテゴリテーブルから何も選択しないので、次のようにしてください。

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

データを制限するために使用しているIDがある可能性もありますが、結合で使用しているがcategories列を参照していないため、実際には意味がありません。 (ランダムな推測として、2つのカテゴリは今ですか?)

したがって、実際にIDで制限したい場合は、おそらく実際に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

Joomlaクエリビルダーメソッドを完全に採用し、結果セットの行インデックスを利用してカウンターを表示するために、ここに推奨されるスニペットを示します...

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

SOURCEはMySQLキーワードですが、RESERVEDキーワードではないため、バッククォートで囲む必要はありません。さらに言えば、どの列にも$db->quoteName()を適用する必要はありません。テーブル名も同様です。

参照されるテーブルは1つだけなので、テーブルエイリアスは不要です。

データを表示するコードcouldは次のように記述します:

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

または、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