сетка magento не может найти столбец, когда я фильтрую - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть пользовательский модуль, который имеет собственную сетку.Одним из полей, которые я добавляю в сетку, является количество записей (заметок), связанных с записью.Он работает нормально и показывает количество в сетке, он тоже хорошо сортируется, но когда я фильтрую, я получаю сообщение о том, что не могу найти столбец.

Вот ошибка:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'note_count' in 'where clause'

А вот код

class Ssi_Crm_Model_Mysql4_Quote_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
{

    protected function _construct()
    {
        $this->_init('crm/quote');
    }

    protected function _initSelect()
    {
        parent::_initSelect();
        $this->_joinUserSet();
        return $this;
    }

    protected function _joinUserSet()
    {
        $this->getSelect()
         ->columns("(SELECT COUNT(note) FROM mage_crm_notes WHERE entity_id = main_table.quote_id AND entity_type = 'quote') as note_count")
            ->join(
                array('user'=>$this->getTable('admin/user')),
                'main_table.user_id=user.user_id',
                array('username' => 'user.username', 'email' => 'user.email'));


        return $this;

    }

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Крис, вы не можете использовать псевдонимы в предложении mySql Где, поэтому вы получаете ошибку при попытке отфильтровать результаты. Это не ошибка mySql, но увидеть похожий запрос на http://bugs.mysql.com/bug.php?id=1505

Скажите, что ваш sql был ...

SELECT field1, field2, (SELECT COUNT (примечание) ОТ mage_crm_notes WHERE entity_id = main_table.quote_id AND entity_type = 'quote') как примечание_счет FROM mage_crm

Вы получите ожидаемые три столбца ...

: field1: field2: note_count:

но вы не можете иметь ...

ВЫБЕРИТЕ field1, field2, (ВЫБЕРИТЕ COUNT (примечание) ОТ mage_crm_notes WHERE entity_id = main_table.quote_id AND entity_type = 'quote') как note_count ОТ mage_crm WHERE note_count> 5

, поскольку вы получите неизвестный столбец 'note_count' в ошибке 'where clause'.

В зависимости от того, как вы фильтруете, вы можете использовать предложение HAVING. Выполните поиск в StackOverflow для похожих запросов (например, . Можно ли использовать псевдоним в предложении WHERE в mysql? )

0 голосов
/ 13 декабря 2011

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

Вместо getSelect()->columns() попробуйте addExpressionAttributeToSelect()

$this->addExpressionAttributeToSelect('note_count',
    '(SELECT COUNT(note) FROM mage_crm_notes WHERE entity_id = main_table.quote_id AND entity_type = "quote")',
    ''
)
->joinTable(
    array('user'=>'admin/user'),
    'user_id=user_id',
    array('username' => 'user.username', 'email' => 'user.email')
);

Если вы не работаете с коллекцией EAV, неприглядный способ достижения того же эффекта, что и addExpressionAttributeToSelect():

$this->_map['fields']['note_count'] = '(SELECT COUNT(note) FROM mage_crm_notes WHERE entity_id = main_table.quote_id AND entity_type = "quote")';
...