Необходимо ли писать дополнительные методы в модели, чтобы вытаскивать некоторые данные?

Допустим, если на какой-то странице необходимо вывести только дату рождения пользователя, необходимо ли писать отдельный метод, который бы из таблицы вытаскивал только ее? Сильно ли это повлияет на работу сайта, если до этого я просто грузил модель и брал из нее то, что нужно?
Вот так например:
class UserController extends Controller {
   public function getDate($id) {
      $criteria = new CDbCriteria;
      $criteria->select = 'date';
      $data = User::model()->findById($id,$criteria);
      // ....
   }
   // ...
}
  • Вопрос задан
  • 2951 просмотр
Решения вопроса 2
Ну я лично пишу подобные функции, только оформляю их в качестве статических и запихиваю их в соответствующую модель, т.е. тот же код можно было оформить так

<?php

class User extends CActiveRecord
{
    // ...
    public static function getDate($id)
    {
        $user = self::model()->findByPk($id, array('select' => 'date'));
        return $user === null ? null : $user->date;
    }
    // ...
}

и в будущем использовать данную функцию так User::getDate($id)
Ответ написан
nowm
@nowm
Если вы уже до этого получали все данные пользователя из БД, то лучше просто возвращать эти данные из свойств UserController. Да, метод отдельный не помешает, но не обязательно генерировать запрос к БД.

Например, если вы уже подгружали пользовательские данные раньше и сохраняли их куда-нибудь вроде $this->_model:

class UserController extends Controller {
  var $_model;

  public function loadModel($id) {
    $this->_model = User::model()->findByPk($id);

   // ...

    return $this->_model;
  }

  // ...

  public function getBirthday($id) {
    if (isset($this->_model->date) && $this->_model->user_id == $id) {
      return $this->_model->date;
    } else {
      $criteria = new CDbCriteria;
      $criteria->select = 'date';
      $data = User::model()->findById($id,$criteria);
      return $data !== null $data->date : null;
    }
  }

  // ...

}


Новый запрос к БД нужно составлять только в том случае, когда, например, вам нужно получить все комментарии конкретного пользователя из этого контроллера, потому что в такой ситуации потребуется новая размерность и новый запрос к БД. А для получения отдельных полей из одной записи лучше один раз получить все данные, хранить их в свойстве контроллера, а потом просто возвращать из памяти, а не генерировать каждый раз новый запрос к БД.

Ваш подход, в принципе, не особенно сильно повлияет на работу сайта — подумаешь, один лишний запрос к БД. Но, вообще, такой подход — неправильный. Тут один лишний запрос, там один лишний запрос. Они в итоге собираются в кучу лишнего потребления ресурсов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
1. работа с данными должна быть в модели
2. если одну дату рождения хотите получить, то не повлияет.
3. контекст вопроса какой?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы