Yii - 从Model获取数据

时间:2014-07-31 14:42:53

标签: php yii

我的控制器中有以下内容:

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

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

我在模型中名为notification.php的文件中有以下内容:

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
}

当我退出行

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

并用静态值替换它可以正常工作。似乎在我的noob方式中,我错过了一些重要的步骤。控制器似乎不知道通知是什么。

提前致谢

2 个答案:

答案 0 :(得分:0)

我相信在控制器上收到通知的最优雅方式是:

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

要实现此目的,您可能需要在扩展CWebUser的类上实现getModel()方法。该方法将返回扩展CActiveRecord的用户的实例。然后您的用户模型可以有一个relations()方法,如下所示:

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

这将阻止您编写该查询并使事情更清晰(在模型和控制器上)。如果愿意,请阅读relations

答案 1 :(得分:-1)

您不能像这样使用通知模型。 您可以使用$notification = new Notification();对其进行实例化 然后执行$notification->getNotificationsByUserId($userID);

然而,这不是很好。我会将通知代码从模型移动到User模型。 这是你甚至不需要传递用户ID。 或者甚至更好,如果您使用Notification制作组件并将其用作服务。