Yii:从单个表单中保存多个模型并检查现有记录

时间:2013-09-20 09:58:14

标签: php mysql activerecord yii yii-cmodel

以下是我所拥有的三张桌子之间的关系。

enter image description here

现在,在通过用户/创建操作创建新用户时,表单将获取用户表字段和单元名称的输入。这里的单位名称不是下拉列表(使用它不是一个选项),而是一个文本字段。如果单元表中不存在表单中输入的单元名称,我需要将其插入单元表中,然后将关系/引用保存在user_unit表中。如果它存在,我只是更新user_unit表。我能够通过在User模型中声明unitname属性然后将其与表单相关联来实现它的工作,然后在控制器中检查单元表中是否存在输入的单元名称。如果它存在,那么我更新UserUnit模型,如果没有,那么我创建单位,然后更新UserUnit。它有效,除了我在更新记录时无法将单元名称与表单相关联。 userunit关系是一个HAS_MANY关系,我猜这是在创建一些问题。有谁能建议我如何解决它?

这是用户/创建动作

$model = new User;
$modeluserunit = new UserUnit;
$user_group=Yii::app()->user->group; 
if(isset($_POST['User']))
    {
        $model->attributes=$_POST['User'];
        //$modeluserunit->attributes=$_POST['UserUnit'];
        $valid=$model->validate(); 
        if($valid)  
            {
                if($model->save(false))  
                {
                    $Userunitmodel = Unit::model()->findByAttributes(array('name'=>$model->unitplaceholder,'groupId'=>$user_group));
                    if (count($Userunitmodel)!=0)
                    {
                        $modeluserunit->UserId = $model->id;  
                        $modeluserunit->unitId = $Userunitmodel->id; 
                        if ($modeluserunit->save()) 
                        {
                            Yii::app()->user->setFlash('success', "User created!"); 
                            $this->redirect(array('view','id'=>$model->id));
                        }
                    }
                    else if (count($Userunitmodel)==0) 
                        {
                            $unitmodel = new Unit;
                            $unitmodel->name=$model->unitplaceholder;
                            $unitmodel->communityId=$user_group;
                            if ($unitmodel->save())  
                            {
                                $modeluserunit->UserId = $model->id;  
                                $modeluserunit->unitId = $unitmodel->id; 
                                if ($modeluserunit->save())  
                                {   Yii::app()->user->setFlash('success', "User created!"); 
                                    $this->redirect(array('view','id'=>$model->id));
                                } 
                            }
                        }
                }
            }
    }
    $this->render('create', array(
        'model'=>$model,
        'modeluserunit'=>$modeluserunit,
    )); 

用户/更新操作

$model=$this->loadModelupdate($id);
if(isset($_POST['User']))
{
$model->attributes=$_POST['User'];
if($model->save())
Yii::app()->user->setFlash('success', "User updated!");     
$this->redirect(array('view','id'=>$model->id));
}

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

和loadModel函数

$criteria=new CDbCriteria();
$criteria->compare('t.id',$id); 
$criteria->compare('unit.groupId',Yii::app()->user->group); 
$model = User::model()->with(array('UserUnits' => array('with' => 'unit')))->find($criteria);
if($model===null)
throw new CHttpException(404,'The requested page does not exist.');
return $model;

用户模型中的关系

return array(
            'userUnits' => array(self::HAS_MANY, 'UserUnit', 'userId'),
        );

2 个答案:

答案 0 :(得分:0)

您应该使用表单模型来实现此目的。在验证结束时,您只需创建用户,然后创建具有给定名称的新单元,然后创建新的user_unit,以提供新创建的用户ID和单元ID。

了解更多Yii Definitive Guide - ModelCFormModel

答案 1 :(得分:0)

在家尝试:

<? /*** stuff for your model User ***/

    // store all ids from rela Model
    public $selectedIds;


    public function relations() 
    {
    return array(
            'userUnits' => array(self::MANY_MANY, 'Unit', 'UserUnit(userId, unitId)','index'=>'id'),
        );
    }


    public function afterFind()
    {
        // "userUnits" is defined in relations()
        $this->selectedIds = array_keys($this->userUnits);
        parent::afterFind();
    }   



    ?>

加载用户模型以进行更新操作后,所有已分配的组(ID)都在$ selectedIds中。 所以你可以迭代它并构建你的ActiveForm输入。