11

単純な質問かもしれませんが、答えが見つかりません。コレクションにデータがないかどうかを知るにはどうすればよいですか?

実行$datas = Mage::getModel('zzz/zzz')->getCollection()する$datas->getData()と空の配列が返されますが、 foreach または getData を実行せずにコレクションにデータがないかどうかを知るにはどうすればよいですか?

4

7 に答える 7

22

countまたはコレクションの使用を避ける必要があります。理由は次のとおりです。

(ほとんどすべての Magento コレクションによって継承されるMage_Core_Model_Resource_Db_Collection_Abstractコレクション モデル) はcount()定義されていないため、コレクションを使用すると、コレクションを実行してから読み込まれたオブジェクトをカウントするため、非常に悪いオプションになるcount可能性が高くなります。Varien_Data_Collection::count()load()

/**
 * Retireve count of collection loaded items
 *
 * @return int
 */
public function count()
{
    $this->load();
    return count($this->_items);
}

大規模なコレクション (特に EAV コレクション) があると、すべてのコレクション データをロードすることになります。これには多くの時間がかかる場合があります。

代わりにVarien_Data_Collection_Db::getSize()、SQL クエリを実行してカウントのみを取得するメソッドを使用する必要があります。これは、コレクションの読み込みのためにすべての種類のデータを取得するよりもはるかに最適化されています。

/**
 * Get collection size
 *
 * @return int
 */
public function getSize()
{
    if (is_null($this->_totalRecords)) {
        $sql = $this->getSelectCountSql();
        $this->_totalRecords = $this->getConnection()->fetchOne($sql, $this->_bindParams);
    }
    return intval($this->_totalRecords);
}

それに加えて、load収集後はいかなる方法でも変更できません。たとえば、 を使用した後は、いつでも並べ替え順序を変更する追加のフィルターを適用できませんcount()

したがって、正しい答えは次のようになります。

$collection = Mage::getModel('zzz/zzz')->getCollection();
var_dump($collection->getSize());
于 2013-03-11T17:07:42.843 に答える
4

次のように if ステートメントを簡単に実行できます。

if (!$datas->getData() || empty($datas->getData())) {
     // do things
}
于 2013-03-11T15:53:02.980 に答える
2

/** * コレクションの全アイテム数を取得 * * @return int */ $collection = Mage::getModel('aaa/bbb')->getCollection()->getSize();

これは、ページネーションなどで使用され、推奨されるコードです。

where /** * コレクションに読み込まれたアイテムの数を取得 * * @return int */ public function count()

読み込まれたアイテムのデータを確認するのに役立ちます。

于 2013-03-11T17:00:21.520 に答える
1

あなたが使用することができます。

$collection = Mage::getModel('zzz/zzz')->getCollection();
var_dump($collection->count());
于 2013-03-11T15:52:44.353 に答える
1

ここでは、コレクションに対してシンプルで標準的な PHPcount()を実行しても問題ありません。コレクションを適切にフィルタリングしている限り、->count()コレクションのメソッドを呼び出してカウントする前に常に行う必要があります。何らかの方法でコレクションを操作するとすぐに、使用するメソッドに関係なく読み込まれます。そのため、標準の PHPは、オブジェクトcount()のメソッドを呼び出し、コレクション全体を a で実行し、すべて同じ方法でコレクションを読み込みます実際、メソッドをさかのぼると、実際に標準の PHP を実行してコレクション データをロードすることがわかります。->count()foreach()load()load()foreach()

したがって、どのように行うかは問題ではありません。データベースから返された結果の数がわかるまで、コレクションを数えることはできません。したがって、上記の方法は問題ありませんが、余分な DB 呼び出しを意味し、最初に数えます。次にロードします。より良い方法は、句などSELECTでステートメントを絞り込んで、ステートメントをできるだけ具体的にすることです。WHEREコレクションから select オブジェクトを取得すると、ここに示すすべての Zend_Db_Select メソッドにアクセスできます。

$collection->getSelect()->where('......... = ?', $var);

于 2013-03-11T17:59:37.757 に答える