Yii и модели

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
rumasterov
Сообщения: 17
Зарегистрирован: 2013.01.18, 19:00

Yii и модели

Сообщение rumasterov »

Здравствуйте!

Возник вопрос по моделям ActiveRecord.

Есть модель User, которая наследуется от CActiveRecord и представляет собой строку пользователя из БД. Я хотел бы добавить свой метод в модель getLastSession(), внутри этого метода создается объект модели Session и выбирается последняя сессия данного пользователя.

Проблема в том, что когда я к модели User применяю метод findBySql(), то объект который вернулся не содержит моего метода getLastSession() и я не могу получить последнюю сессию пользователя из таблицы базы данных где хранятся все сессии данного пользователя. Это я так понимаю связано с тем что возвращается экземпляр класса CActiveRecord, каким образом можно вернуть после поиска экземпляр User, чтобы там был мой метод getLastSession() и я его мог применить к объекту что вернулся после поиска. Также там может быть еще несколько методов, например getTotalUserComments() и т.д.

Выборка пользователя осуществляется таким образом:

Код: Выделить всё

$user = User::model() -> findBySql('SELECT * FROM users WHERE user_id = ' . $userId . ' LIMIT 1');
Другими словами, каким образом я могу заполнить сущность User, чтобы она загрузилась и у меня были доступны методы которые я добавил. Больше всего интересует когда возвращается коллекция User и чтобы я к каждому мог применять свои методы модели. Т.е. я выбираю 10 пользователей, вывожу их данные и для каждого пользователя сразу запрашиваю его последнюю сессию и вывожу по ней данные.

Заранее благодарю.

Модель User

Код: Выделить всё

class User extends CActiveRecord {
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return 'users';
    }

    public function relations()
    {
        return array(
            'profile' => array(self::HAS_ONE, 'UserProfile', 'user_id'),
        );
    }

    public function getLastSession() {
        /** @var Session $session */
        $session = Session::model() -> findBySql('SELECT * FROM session WHERE user_id = ' . $this -> user_id . ' ORDER BY session_id DESC LIMIT 1');

        if (is_object($session)) {
            return $session;
        } else {
            return false;
        }
    }
}
Последний раз редактировалось rumasterov 2013.10.13, 13:20, всего редактировалось 1 раз.
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Yii и модели

Сообщение masson »

Заставлять каждую строчку БД выбирать сессию и считать комментарии пользователя - это жоска! :roll:

1. Данные пользователя которые необходимо хранить в сессии задаются UserIdentity (setState) и хранятся в CWebUser - http://yiiframework.ru/doc/guide/ru/topics.auth
А зачем выбирать сессии других пользователей?
2. Кол-ва комментариев и проч.статистика устанавливаются ч/з relations - http://yiiframework.ru/doc/guide/ru/database.arr
3. Метод User::model() -> findBySql должен возвращать именно ту модель User которую просите, со всеми соответствующими атрибутами. А в CActiveRecord никаких атрибутов не задано, нет никакого смысла ее возвращать.
4. Если метод findBySql ничего не находит - то возвращается null, других проверок типа is_object не требуется.
rumasterov
Сообщения: 17
Зарегистрирован: 2013.01.18, 19:00

Re: Yii и модели

Сообщение rumasterov »

masson писал(а):Заставлять каждую строчку БД выбирать сессию и считать комментарии пользователя - это жоска! :roll:
Не совсем понимаю, чем это смутило, особенно что касается сессии. Если мы делаем через relations это по сути будет тот же запрос когда мы обратимся например за профайлом пользователя через $user -> profile. Объясните пожалуйста, если есть возможность.
masson писал(а):1. Данные пользователя которые необходимо хранить задаются UserIdentity (setState) и хранятся в CWebUser - http://yiiframework.ru/doc/guide/ru/topics.auth
А зачем выбирать сессии других пользователей?
Это своего рода вывод списка пользователей с указанием различных данных - заполнен ли профайл, сколько комментариев оставил и т.д. Соответственно я получаю коллекцию моделей User по критериям, и для каждого хочу получить информацию - сессию последнюю из базы данных, количество комментариев и т.д.
masson писал(а):2. Кол-ва комментариев и проч.статистика устанавливаются ч/з relations - http://yiiframework.ru/doc/guide/ru/database.arr
У меня сейчас через relations() только профайл пользователя подгружается, изучу подробнее, спасибо.
masson писал(а):3. Метод User::model() -> findBySql должен возвращать именно ту модель User которую просите, со всеми соответствующими атрибутами. А в CActiveRecord никаких атрибутов не задано, нет никакого смысла ее возвращать.
Да, точно, тут я не досмотрел, в модели есть мой метод. Спасибо.
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Yii и модели

Сообщение masson »

rumasterov писал(а):Это своего рода вывод списка пользователей с указанием различных данных - заполнен ли профайл, сколько комментариев оставил и т.д. Соответственно я получаю коллекцию моделей User по критериям, и для каждого хочу получить информацию - сессию последнюю из базы данных, количество комментариев и т.д.
Ну это обычные запросы из таблиц User и проч. Слово "сессия" тут не очень уместно, под сессией обычно подразумевают это - http://www.yiiframework.com/doc/api/1.1/CHttpSession ... обычно там дублируются данные профиля пользователя, которые можно достать из таблиц.
Лучше переименуйте, чтоб и самому не путаться и других не вводить в заблуждение.
Последний раз редактировалось masson 2013.10.13, 13:20, всего редактировалось 1 раз.
rumasterov
Сообщения: 17
Зарегистрирован: 2013.01.18, 19:00

Re: Yii и модели

Сообщение rumasterov »

masson писал(а):
rumasterov писал(а):Это своего рода вывод списка пользователей с указанием различных данных - заполнен ли профайл, сколько комментариев оставил и т.д. Соответственно я получаю коллекцию моделей User по критериям, и для каждого хочу получить информацию - сессию последнюю из базы данных, количество комментариев и т.д.
Ну это обычные запросы из таблиц User и проч. Слово "сессия" тут не очень уместно, под сессией обычно подразумевают это - http://www.yiiframework.com/doc/api/1.1/CHttpSession
Лучше переименуйте, чтоб и самому не путаться и других не вводить в заблуждение.
Да, согласен, речь шла об сессионой истории пользователя, которая хранится в таблице базы данных - где указано с какого ip-адреса заходил и другая информация.
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Yii и модели

Сообщение masson »

Значит все ваши вопросы легко решаются ч/з relations
Ответить