0

我知道这是一个饱受摧残的话题,但是,我是一个完全的新手,我一直在努力解决这个问题,但一直未能解决。

我有两个表:帖子和标签

现在这个场景中定义的关系是多对多的。因此它有一个名为“tbl_tags_has_tbl_post”的表。这是存储关系之间的分配。

现在我在我的“post”模型中获取“tag”模型的数据,并且我已经能够从 Post 表单中保存标签的数据。但是,现在我无法在“tbl_tags_has_tbl_post”表中分配值。

我什至尝试过使用 CAdvancedArRelationship 扩展和插件,但仍然无济于事。

这是我的数据库结构图形:

在此处输入图像描述

这是我在 Post 表中定义的关系:

public function relations()
        {
                // NOTE: you may need to adjust the relation name and the related
                // class name for the relations automatically generated below.
                return array(
                        'comments' => array(self::HAS_MANY, 'Comment', 'tbl_post_id'),
                        'author' => array(self::BELONGS_TO, 'User', 'tbl_user_id'),
                        'tagsRelation' => array(self::MANY_MANY, 'Tags', 'tbl_tags_has_tbl_post(tbl_post_id, tbl_tags_id)'),
                        'commentCount' => array(self::STAT,'Comment','tbl_post_id'), // this shall count the number of comments present
                );
        }

这是我在我的标签模型中定义的关系:

public function relations()
        {
                // NOTE: you may need to adjust the relation name and the related
                // class name for the relations automatically generated below.
                return array(
                        'posts' => array(self::MANY_MANY, 'Post', 'tbl_tags_has_tbl_post(tbl_tags_id, tbl_post_id)'),
                );
        }

这是我的 PostController 类中的 actionCreate() 方法:

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

                $tags = new Tags; // This is for initializing the second model


                $model->tbl_user_id = Yii::app()->user->id;

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

                if(isset($_POST['Post'],$_POST['Tags']))
                {
                        $model->attributes=$_POST['Post'];
                        $tags->attributes = $_POST['Tags'];
                        $valid=$model->validate();
                $valid=$tags->validate() && $valid;

                if($valid)
        {
            // use false parameter to disable validation

            $tags->save(false);
            // ...redirect to another page
            // 

        }
                        if($model->save()){

                        $this->redirect(array('view','id'=>$model->id));
                        }
                }

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

所以现在,我想要做的是,每当创建一个带有少量标签的帖子时,分配表也应该自动填充,例如:

tbl_post_id tbl_tags_id 1 1 2 1 2 2

类似的东西。

我什至也尝试过使用 CAdvancedAr 扩展,但我无法让它运行。我真的一无所知,我尝试了很多东西,但无法将值插入分配表中。

如果我要使用扩展,任何人都可以描述在这种情况下这样做的方法吗?

任何人都可以指导我哪里出错了,我需要做什么?如果这个问题真的很老,我很抱歉。但我真的被困在这里。

问候,

4

1 回答 1

1

我将展示我是如何做到这一点的。也许它不是最好的方法,但它仍然有效。我使用afterSave函数。在您的情况下,您将希望在后期模型中使用它。

protected function afterSave()
    {
        parent::afterSave();
        $relation_table=new TablehasPosts;//your relation model here
        $relation_table->tbl_post_id=$this->id;//post id here to relation model
        $output=array();
        foreach($_POST[tag_id] as $tag_id)//depends on what you have to define tags //id's in your form (checkboxlist, multiselect etc...) 
        {
          array_push($output,$tag_id);//push your id's to some array
        }
        $relation_table->tbl_tags_id=serialize($output);//in your way to store this         
     }

这是我如何处理它的一个例子。我试图写接近你的模型。希望这将帮助您至少看到这条线。

于 2013-05-23T06:53:43.800 回答