与复选框实现many_to_many关系

时间:2013-04-15 22:51:42

标签: php yii many-to-many

我已经陷入了一些我认为属于我与多对多关系的经历的事情。

在我的应用程序中,我将兴趣映射到具有多对多的产品。我希望创建以下方案,其中完整的兴趣列表列在具有复选框的特定产品下。对于提交表单时选中的每个复选框,都会在InterestProductAssignment表中添加一行。

在我的产品控制器中,我打电话给完整的兴趣列表 -

$interests = Interest::model()->findAll();

实际上我没有比这更进一步,因为我的脑子里想知道从哪里开始。到目前为止我所尝试的是构建一个InterestProductAssignment对象数组,以匹配我上面返回的兴趣数组。我已经尝试将它传递给视图并构建表单,但是我试图将两者匹配起来让我自己相当困惑,我无法相信我正在使用Yii,因为它很混乱。

是否有人能够概述这个问题的解决方案,这使我能够在提交时为每个兴趣添加一个复选框,以便在产品和兴趣之间添加链接?我有兴趣看看你在控制器和视图中写了什么。

只是澄清一下,这个页面只是一个产品的主题。

EXTENSION

对于我所提出的补充问题,我发布了我已经获得的代码,一旦发现错误,这也可能有助于其他人实现类似的事情。

我的产品控制器中的关系是这样的 -

            'interests'=>array(self::MANY_MANY, 'Interest', 'interest_product_assignment(interest_id, product_id)')

控制器

    public function actionUpdate($id)
{
            // loadModel as been adapted to be called "->with('interests')"
    $model=$this->loadModel($id);

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

    if(isset($_POST['Product']))
    {
        $model->attributes=$_POST['Product'];
        if($model->save())
            foreach($_POST['ProductInterest'] as $i => $interest_id){
                $this_interest = new InterestProductAssignment;
                $this_interest->product_id = $model->id;
                $this_interest->interest_id = $interest_id;
                $this_interest->save();
            }
            $this->redirect(array('view','id'=>$model->id));
    }

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

查看_form.php的相关部分

<div class="row">
    <?php echo CHtml::checkBoxList('ProductInterest', CHtml::listData($model->interests, 'interest_id', true), CHtml::listData(Interest::model()->findAll(), 'id', 'interest'));?>
</div>

问题是checkBoxList中的第二个字段似乎没有正确填写已选中的复选框。我怀疑这可能是一个愚蠢的错误。我无法发现它,我对checkBoxList不够熟悉。

提前致谢。

1 个答案:

答案 0 :(得分:0)

鹅,

我认为你在这里寻找的是CheckBoxList

在表单中,您可以使用代码

echo CHtml::checkBoxList('Product_Interests', $model->getInterests(), CHtml::listData(Interest::model()->findAll(), 'interest_id', 'interest_title'));
//$model->getInterests() is a method that should returns an array of IDs of all the currently selected interests

然后在你的控制器中你可以使用代码:

foreach($_POST['Product_Interests'] as $interest_id=>$checked)
    if($checked)
      $model->addInterest($interest_id); //Add Interest
    else
      $model->removeInterest($interest_id); //Remove an Interest if it exists
//Note: If you have a model that connects these tables those can be created or destroyed here