2015-05-12 2 views
0

У меня есть модель NON-EAV, и я хочу, чтобы фильтровать по своей коллекции, как показано нижеКоллекция addFieldToFilter не фильтруя

$td_trans_collection = Mage::getModel('tichdiem/scoretransaction')->getCollection();   
$td_trans_collection->addFieldToFilter('increment_id', $incrementId) 
        ->addFieldToFilter('action', self::TICHDIEM_ADD) 
        ->load(); 

плодоовощного запрос по

$td_trans_collection->getSelect()->__toString(); 

возвращение

SELECT `main_table`.* FROM `fhs_td_score_transaction` AS `main_table` WHERE (increment_id = '100010565') AND (action = '0') 

, который является правильным запросом, должен возвращать только 1 ответ. Я также выполнил этот запрос на терминале. Однако, когда я просматриваю коллекцию, как

foreach($td_trans_collection as $item){ 
    echo $item; 
} 

У меня есть все записи внутри моего стола, почему это так? Я использую Magento 1.9.1

+0

Почему бы не использовать getFirstItem() вместо нагрузки(), если вы должны получить только одну строку? Вам не пришлось бы петли. – adrien54

ответ

1

Сначала проверьте, что непосредственно выберите запрос в своей базе данных, чтобы узнать, что он возвращает. Если он возвращает только одну строку, как вы хотите, значит, это где-то в Magento, возможно, что-то изменяет вашу коллекцию.

В качестве альтернативы, вы можете попробовать этот метод, чтобы ограничить сбор 1 результат:

$td_trans_collection->getSelect()->limit(1); 

Вы также можете попробовать:

$td_trans_collection->getFirstItem()->getData(); 

Если надежно возвращает результат, который вы хотите, то проблема решена ,

Если выше не удается, перейдите по ссылке: Lib/Varien/Db/Adapter/PDO/Mysql.php и найдите следующие свойства и изменить их, как показано ниже:

protected $_debug    = true; 
protected $_logAllQueries  = true; 

После установки этих значений true, снова запустите свою коллекцию. Затем перейдите к: var/debug/pdo_mysql.log и внимательно изучите окончательные запросы, которые были выполнены. Надеюсь, это даст вам более полное представление о том, что происходит.

Кроме того, удалить ->load();

+0

'$ td_trans_collection-> getData()' возвращает правильный элемент в таблице, которую я хотел, однако он возвращался в формате массива вместо Object. Теперь я знаю, что у меня хотя бы 1 резервное решение. Запрос выполняется правильно на терминале базы данных, только коллекция возвращает все записи в моей таблице. Я попытаюсь использовать '$ _debug' и' $ _logAllQueries', чтобы увидеть, могу ли я обнаружить что-то неправильное. –

+0

-> getData() всегда возвращается как массив.Просто удалите getData(), и это будет объект –

+0

@ThangPham Помог ли этот ответ вам? Если это так, отметьте его как принятый, чтобы я мог получить кредит за него. Лучше поздно, чем никогда. Благодаря! –

0

Если вы заявляете, что ваш запрос возвращает 1 запись.

Правильный путь к проходной коллекции

foreach($td_trans_collection as $item){ 
var_dump($item->getData()); 
} 
+0

Пожалуйста, снова прочитайте мой вопрос, у меня есть точная петля, как вы указали здесь. Он показывает записи всей таблицы. –

+0

, чтобы получить значение определенной строки, например, increment_id, вы можете использовать $ item-> getIncrementId(). По умолчанию коллекция отображает все записи таблицы. –

1

Не называйте нагрузки(), вы будете получать все снова, когда у вас уже есть, что в объекте коллекции. Коллекция является ассоциативным массивом, добавьте

Смежные вопросы