Перегруппировка активных элементов записи в Yii - PullRequest
0 голосов
/ 17 сентября 2011

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

Решение, которое я имею в виду, состоит в получении активных записей с определенными критериями, подобными этому

$theModelsINeed = MyModel::model()->findAll($criteria); 

, а затем изменить порядок из моего PHP-кода.Как я могу это сделать?Я имею в виду, я знаю, как перебирать его элементы, но я не знаю, возможно ли их реально изменить.

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

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 сентября 2011

Если вы хотите получить массив в результате, вы можете использовать этот метод для выборки данных, которые поддерживают dbCriteria:

$model = MyModel::model()->myScope();
$model->dbCriteria->condition .= " AND date BETWEEN :d1 AND :d2";
$model->dbCriteria->order = 'field1 ASC, field2 DESC';
$model->dbCriteria->params = array(':d1'=>$d1, ':d2'=>$d2);

$theModelsINeed = $model->getCommandBuilder()
    ->createFindCommand($model->tableSchema, $model->dbCriteria)
    ->queryAll();

В приведенном выше примере показано использование определенной области действия и изменение условия с помощью именованных параметров.

Если вам не нужна Active Record, вы также можете заглянуть в Query Builder , но вышеописанный метод мне очень помог, когда я хочу использовать AR, но мне нужен массив для моего результата.

0 голосов
/ 17 сентября 2011

В активных записях Yii нет ничего особенного.Семейство методов find вернет массив объектов, и вы можете отсортировать этот массив, как и любой другой массив в PHP.

Если у вас сложные критерии сортировки, это означает, что, вероятно, лучший инструмент для этогоusort.Поскольку вы будете иметь дело с объектами, ваши пользовательские функции сравнения будут выглядеть примерно так:

function compare($x, $y)
{
    // First sort criterion: $obj->Name
    if ($x->Name != $y->Name) {
        return $x->Name < $y->Name ? -1 : 1; // this is an ascending sort
    }

    // Second sort criterion: $obj->Age
    if ($x->Age != $y->Age) {
        return $x->Age < $y->Age ? 1 : -1; // this is a descending sort
    }

    // Add more criteria here

    return 0; // if we get this far, the items are equal
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...