Yii упорядочить по другой таблице CActiveDataProvider - PullRequest
3 голосов
/ 14 марта 2011

Я немного озадачен этим. В основном у меня есть две таблицы:

Страница:

  • ID
  • имя

Очки:

  • id-
  • PageId
  • точка

Я хочу получить записи из таблицы Page и отсортировать их по количеству баллов в таблице Points (поле точек)

В настоящее время у меня есть:

$dataProvider=new CActiveDataProvider('Page',array(
        'criteria'=>array(
            'condition'=>"active = 1 AND userid IN (".$ids.")",
            'order'=>"???",
        ),

        'pagination'=>array(
            'pageSize'=>30,
        ),
    ));

Я просто не знаю, как отсортировать его по значению таблицы Points для соответствующей записи Я установил отношение для таблиц Page / Points следующим образом:

(в модели страницы)

'pagepoints' => array(self::HAS_ONE, 'Points', 'pageid'),

Спасибо

Ответы [ 3 ]

4 голосов
/ 15 марта 2011

Вам нужно сделать две вещи:

  1. Добавить отношение pagepoints к with части критерия запроса
  2. Ссылка на столбец, по которому вы хотите отсортировать вorder часть критериев

Я выделил строки, где это происходит, в приведенном ниже коде:

$dataProvider = new CActiveDataProvider('Page', array(
    'criteria'=>array(
        'with' => array('pagepoints'),  // #1 
        'condition' => 'active = 1 AND userid IN ('.$ids.')',
        'order' => 'pagepoints.points', // #2
    ),

    'pagination'=>array(
        'pageSize'=>30,
    ),
));

Что нужно знать, чтобы понять, как это работаетв том, что когда Yii создает запрос SQL (который является LEFT OUTER JOIN для таблицы Points), он использует имя, которое вы дали отношению в модели Page (вы даете определение для этого, это pagepoints) для псевдонима присоединяемой таблицы.Другими словами, запрос выглядит так:

SELECT ... FROM Page ... LEFT OUTER JOIN `Points` `pagepoints` ...

Из этого следует, что правильная спецификация для порядка сортировки: pagepoints.points: pagepoints - это псевдоним таблицы, а points - это столбец, в которомтаблица.

1 голос
/ 15 марта 2011

Попробуйте следующее

$dataProvider=new CActiveDataProvider('Page',array(
        'criteria'=>array(
            'with'=>array('pagepoints'),
            'condition'=>"active = 1 AND userid IN (".$ids.")",
            'order'=>"t.points DESC",
        ),

        'pagination'=>array(
            'pageSize'=>30,
        ),
    ));
0 голосов
/ 23 марта 2011

это sql, который вы хотите сгенерировать:

выберите * из внутренних точек соединения на странице pageid.

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