Коллекция Magento - фильтр по нескольким полям - PullRequest
7 голосов
/ 23 февраля 2012

Используя модели коллекции Magentos, как мне добавить компонент / фильтр запроса, например:

WHERE (main_table.x < 1 OR (main_table.x - main_table.y) >= 5)

Обновление Я сейчас запускаю это:

$this->getSelect()
    ->where('main_table.x < 1')
    ->orWhere('(main_table.x - main_table.y) >= :qty');
$this->addBindParam(':qty', $qty);

Результат:

SELECT ... WHERE ... AND ... AND (main_table.x < 1) OR ((main_table.x - main_table.y) >= :qty) ORDER BY ...

Проблема в том, что я не могу связать $qty с :qty

Обновление 2 Я закончил с этим, так как мне нужно OR в скобках

$this->getSelect()->where('(main_table.x < 1 OR (main_table.x - main_table.y) >= ?)', $qty);

Ответы [ 2 ]

6 голосов
/ 23 февраля 2012

Когда вы используете метод getSelect, вы игнорируете интерфейс коллекции моделей Magento. Иногда это единственный способ получить именно тот запрос выбора, который вам нужен, но имейте в виду, что он может не совпадать на 100% с тем, что делает интерфейс модели Magento.

Когда вы используете метод bindParamater, вы используете интерфейс модели Magento. Я не могу говорить с , почему это не работает, но я подозреваю, что объект выбора Zend и объекты коллекции моделей Magento связывают свои параметры в разное время и по-разному.

Чтобы получить требуемые результаты, пропустите метод bindParamater и используйте более простую замену параметра ? метода orWhere.

$this->getSelect()
    ->where('main_table.x < 1')
    ->orWhere('(main_table.x - main_table.y) >= ?',$qty);
3 голосов
/ 24 февраля 2012

Blockquote Проблема в том, что я не могу связать $ qty с: qty

Ну, на самом деле это не проблема, это то, как работает механизм PDO / MySQLпараметры подготовки и привязки оператора запроса - которые отправляются отдельно - и выполнение запроса впоследствии.

Таким образом, на уровне абстракции БД не создается окончательный оператор запроса, если вы используете Параметры привязки

См. Этот вопрос stackoverflow и Руководство по PDO .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...