0

次のコードがあります。

$recipients = Mage::getResourceModel('crm/crm_collection');
            $recipients->getSelect()
                    ->joinInner(array(
                        'link' => $recipients->getTable('crm/bulkMailLink'),
                    ), "link.crm_id = e.entity_id", array(
                        'link_id' => 'link.id',
                    ))
                    ->where("link.queue_id = ? AND link.sent_at IS NULL", $queue->getId());
            $recipients->addAttributeToSelect('title');
            $recipients->addAttributeToSelect('first_name');
            $recipients->addAttributeToSelect('chinese_name');
            $recipients->addAttributeToSelect('last_name');
            $recipients->addAttributeToSelect('email1');
            $recipients->addAttributeToFilter('email1', array('neq'=>''));
            $recipients->setPageSize(100);
            $recipients->setCurPage(1);

次に、コードが生成する select ステートメントをログに記録します。

Mage::log("DEBUG: ".((string)$recipients->getSelect()));

上記は、phpmyadminで完全に実行され、私が期待する結果を返す実用的なSQLクエリを生成します.

次に、$recipients の数をログに記録します

Mage::log("Loading recipients for queue: {$recipients->count()}");

そして、ここでコードが停止します。実際には、メッセージをログに記録することさえありません。上記のロギング コードをコメント アウトして、

foreach ($recipients as $crm)
{
    var_dump($crm);
    die();
}

foreach には入りません。パーサーは foreach の前に停止します。

そして最悪なのは、エラー メッセージが表示されないことです。私は真剣に立ち往生しています。

ありがとうございました

4

1 に答える 1

1

との両方のcount()操作foreachがコレクションを実際にトリガーしload()ます。つまり、クエリが実行され、結果セットがフェッチされ、各結果が_dataコレクションのモデル クラスのインスタンスに設定されます。アイテムが認識された後、コレクション クラスは を介し​​て内部ストレージにアイテムを追加しようとしaddItem()ます。

結果セットに重複した主キーがあるため、コレクションが明示的に例外をスローしていると思われます。Varien_Data_Collection::addItem()ロジックについては、を参照してください。これを一時的にコメントアウトしてテストします。

解決するには、クエリを変更するかaddItem()、コレクション クラスでローカルにオーバーライドします。

于 2013-05-09T17:17:53.327 に答える