Codeigniter 'order_by' автоматически добавляет порядок по 'id' - PullRequest
0 голосов
/ 04 марта 2020

у меня есть эта таблица:

LANGUAGES

ID  NAME    DEFAULT ACTIVE
1   English     0     1
2   Italian     1     1 
3   Spanish     0     1

Порядок извлечения: все активные, но сначала по умолчанию, затем остальные. Я использую этот запрос внутри codeigniter:

public function get_languages_list() {

    $array = array();

    $this->db->select('*');
    $this->db->from('languages');
    $this->db->order_by('default','desc');
    $this->db->where("active",1);
    $query = $this->db->get();

    foreach($query->result() as $row) {
        $array[$row->id] = array();
        $array[$row->id]["name"] = $row->name;
        $array[$row->id]["default"] = $row->default;
        $array[$row->id]["active"] = $row->active;
    }
    return $array;  

}

, он работает правильно, но только в некоторых случаях. В других порядок не работает правильно. Я распечатал запросы в обоих случаях:

ПРАВИЛЬНЫЙ СЛУЧАЙ

SELECT * FROM `languages` WHERE `active` = 1 ORDER BY `default` DESC 

СТРАННЫЙ СЛУЧАЙ

SELECT * FROM `languages` WHERE `active` = 1 ORDER BY `id`, `default` DESC 

Codeigniter добавляет 'id' в поведение order_by. Способ, которым я вызываю этот запрос, всегда один и тот же, динамических параметров c нет, записи в БД одинаковы для обоих случаев, в любом случае результирующий запрос отличается. Я не могу найти ничего связанного с этой вещью в документах codeigniter. Как это возможно? Может это ошибка?

РЕДАКТИРОВАТЬ

Теперь я вставил полный метод, чтобы показать, что нет параметров или особых условий. Я также пробовал эту альтернативу в порядке элементов запроса:

$this->db->select('*');
$this->db->from('languages');
$this->db->where("active",1);
$this->db->order_by('default','desc');
$query = $this->db->get();

результат тот же. Я попытался добавить некоторые другие условия в order_by, но результат тот же.

РЕДАКТИРОВАТЬ 2

моя версия codeigniter:

CI-3.1.10

1 Ответ

0 голосов
/ 05 марта 2020

Ну, в соответствии с ситуацией, которую я понял из вашего вопроса, это совершенно нормальное явление.

Это просто поведение по умолчанию системы сортировки, предоставляемой базой данных. В указанном c случае, когда данные были закончены сортировкой по заданному атрибуту; в вашем случае это атрибут DEFAULT; затем, если он встретит (почти во всех реальных случаях) записи с одинаковым значением из этого атрибута, он проверит первичный идентификатор для сортировки. Таким образом, это является причиной того, что похоже, что выходные данные запроса неверны.

Вы можете попробовать перестроить код, как показано ниже:

$this->db->select('*');
$this->db->from('tbl_languages');
$this->db->where("is_active",1);
$this->db->order_by('is_default','desc');
$query = $this->db->get();

Обратите внимание, что я изменилось только положение между строкой WHERE и строкой ORDER_BY

И вы также можете добавить дополнительные специфические c атрибуты для сортировки.

Однако это только из моего предположения. Я думаю, что вы должны показать нам часть данных и случаи, с которыми вы столкнулись в реальной жизни, где вы нашли «ошибку», чтобы мы могли анализировать глубже и дальше.

Спасибо.

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