Zend Db заказ по индивидуальному списку - PullRequest
1 голос
/ 16 февраля 2012

Я бы хотел отсортировать некоторые строки своей базы данных в пользовательском списке с помощью Zend Db.

У них есть поле page_type, которое может быть 0, 1, 2 или 3, и я хотел бы ихв следующем порядке: 1,3,2,0

Я обнаружил, что это возможно с MySQL :

SELECT id 
FROM table 
WHERE id IN (15,21,4,8) 
ORDER BY id = 15 DESC, id = 21 DESC, id = 4 DESC, id = 8 DESC

Возможно ли это с Zend Db илия должен просто использовать простой MySQL здесь?

Это мой код сейчас:

$select = $this->select()
    ->order(array(
        'asc' => 'page_type'
    ));

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Можно изменить тип_страницы на ENUM («1», «3», «2», «0») (обратите внимание на порядок).Внутренне MySQL свяжет индекс 0 со значением 1, индекс 1 со значением 3 и т. Д. И т. Д.

Если вы затем упорядочите по типу ASC page_type, он будет упорядочен в том порядке, в каком вы хотите, в соответствии с порядком ENUM.ключ, а не фактический текст, к которому относится каждый ключ.

В зависимости от того, какой тип page_type действительно ссылается на вас, вы всегда можете вместо этого использовать текстовые дескрипторы, например ENUM («новости», «что-то еще», .....) - вы не предоставили никакой информации о том, на что эти ссылки ссылаютсяпоэтому не могу дать дальнейшие рекомендации по этому вопросу.

Более подробную информацию о enum можно найти здесь: http://dev.mysql.com/doc/refman/5.0/en/enum.html (прокрутите вниз до места начала абзаца "Значения ENUM отсортированы в соответствии с" ....

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

1 голос
/ 16 февраля 2012

Какую версию Zend Framework вы используете? Ниже используется для работы в 1.1x:

$select->order(array(
    new Zend_Db_Expr("page_type = 1 DESC"),
    new Zend_Db_Expr("page_type = 3 DESC"),
    new Zend_Db_Expr("page_type = 2 DESC"),
    new Zend_Db_Expr("page_type = 0 DESC")
));

или

$select->order(array(
    new Zend_Db_Expr("page_type = 1 DESC, page_type = 3 DESC, page_type = 2 DESC, page_type = 0 DESC")
));

Zend_Db_Expr полезно, когда вы хотите вставить литературную строку в запрос, но, как вы, наверное, знаете, вы должны быть очень осторожны при вставке литературных строк в запросы. Так что выполняйте правильную проверку / фильтрацию / экранирование при использовании этого решения.

...