如何在不使用控制器的情况下更新外键? - yii,php

时间:2014-07-09 14:02:32

标签: php mysql yii

我最近创建了一个包含用户,mobile_accounts和paylists表的数据库。付费列表和mobile_accounts都链接回用户,并且都具有外来ID" user_id"。当我让用户创建自己的paylists或mobile_accounts时,我使用的是我在用户模型中创建的一个名为" addUserId"的函数。我在每个特定控制器(即paylists或mobile_accounts)中调用该函数,同时传入当前模型和user_id。这对我很好,但它似乎是一个解决方案。 在如何使用外键更新数据库方面,我是否遗漏了一些非常简单的内容?或者我将来必须继续创建这样的功能吗?

以下是薪资单控制器中的代码

public function actionCreate()
{
    $model=new Paylist;

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);

    if(isset($_POST['Paylist']))
    {
        $model->attributes=$_POST['Paylist'];
        if($model->save())
            // adds the current UserId to the table
            User::model()->addUserId($model);
            $this->redirect(array('view','id'=>$model->id));
    }

    $this->render('create',array(
        'model'=>$model,
    ));
}

以下是用户模型中的代码

// adds the user id to your data table, takes in the user id and adds it to specified model 
public function addUserId($model)
{  
    $accountid = $model->id;
    $current_email = Yii::app()->user->getId();
    // gets the current id of the user 
    $user = User::model()->findByAttributes(array('email'=>$current_email));
    // extracts out the id of the current user 
    $user_id = $user->id; 
    $model->updateByPk($accountid,array('user_id'=>$user_id)); 

}

1 个答案:

答案 0 :(得分:1)

您可以在模型中使用CActiveRecord::beforeSave()方法:

public function beforeSave(){
   if($this->isNewRecord){
       User::model()->addUserId($this);
   }
   return parent::beforeSave();
}

并更改addUserId方法:

public function addUserId($model)
{  
    $accountid = $model->id;
    $current_email = Yii::app()->user->getId();
    $user = User::model()->findByAttributes(array('email'=>$current_email));
    $model->user_id = $user->id; ; // just set user_id attribute
}

此外,您可以在getCurrentUserId模型中实现方法User,该方法返回当前用户ID并在beforeSave中调用此方法:

public function beforeSave(){
   if($this->isNewRecord){
       $this->user_id = User::getCurrentUserId();
   }
   return parent::beforeSave();
}