简体   繁体   中英

Yii - Get data from Model

I have the following in my controller:

public function actionIndex() {
  $userID = Yii::app()->user->getId();
  $arNotifs = Notification::model()->getNotificationsByUserId($userID);

  $this->render('index', array("arNotifications"=>$arNotifs, "userID"=>$userID));
}

I have the following in a file called notification.php in my models:

class Notification extends CActiveRecord {
  // ------ BUNCH OF STUFF
  public function getNotificationsByUserId($userId) {
    $userId = (int) $userId;        
    $query = Yii::app()->db->createCommand();
    $query->select('n.id, n.title, n.content, n.updated');
    $query->from('hr4_notification_x_user nxu');
    $query->join('hr4_notification n', 'nxu.notification = n.id');
    $query->where('nxu.user=:userId', array(':userId' => $userId);
    return $query->queryAll();
  }
  // ------ MORE STUFF
}

When I rem out the line

$arNotifs = Notification::model()->getNotificationsByUserId($userID);

and replace it with a static value it works fine. It seems that in my noob ways I am missing some vital step. The controller seems to have no idea what Notification is.

Thanks in advance

I believe the most elegant way to get your notifications on the controller would be something like:

$arNotifs = Yii::app()->user->model->notifications;

To achieve such, you might need to implement a getModel() method on your class that extends CWebUser. That method would return an instance of an user that extends CActiveRecord. Then your user model can have a relations() method, like the following:

class UserModel extends CActiveRecord {
    public function relations() {
        return array(
            'notifications' => array(self::HAS_MANY, 'Notification', 'user'),
        );
    }
}

This will prevent you from writing that query and will make things more clear (on both, models and controller). If you will, read a bit about relations .

You cannot use the Notification model like this. You can instantiate it with $notification = new Notification(); and then do a $notification->getNotificationsByUserId($userID);

However this would be not very good. I would move the notification code from the model to the User model. This was you dont even need to pass the user ID. Or maybe even better, if you make a component out of Notification and use it as a service.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM