在任务表中保存许多人Yii

时间:2013-05-23 01:00:22

标签: php activerecord yii relational-database yii-extensions

我知道这是一个受到重创的话题但是,我是一个完整的新手,我一直试图解决这个问题很长一段时间但现在还没有得到它。

我有两个表:帖子和标签

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

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

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

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

enter image description here

这是我在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扩展程序,但我无法让它运行。我真的很无能,我尝试了很多东西但是却无法在赋值表中插入值。

如果我要使用扩展名,那么有人可以在这种情况下描述这样做的方法吗?

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

问候,

1 个答案:

答案 0 :(得分: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         
     }

这是我如何处理它的一个例子。我试着写近你的模特。 希望这会帮助你至少看到这条线。