保存多个选择输入

时间:2014-10-19 20:02:48

标签: php cakephp cakephp-2.4

我有

模型
  • 用户(ID,姓名)
  • 部分(id,name)
  • section_users(ID,USER_ID,SECTION_ID)

管理员分别添加所有用户和部分。一旦添加了这些,我希望管理员选择该部分并在section_users中添加其中的所有用户


我有一个选择输入,其中多个设置为true。如何以cakephp的方式保存这些数据以及验证。

<?php echo $this->Form->input("section_id"); ?>
<?php echo $this->Form->input("user_id", array('multiple'=>'checkbox')); ?>

这会生成

Array
(
    [section_id] => 1
    [user_id] => Array
        (
            [0] => 3
            [1] => 4
        )

)

我知道我可以循环并转换为此并使用saveAll或saveMany但是cakephp方式/正确方法是什么。

Array
(
    [0] => Array
        (
            [section_id] => 1
            [user_id] => 3
        )
    [1] => Array
        (
            [section_id] => 1
            [user_id] => 4
        )

)

3 个答案:

答案 0 :(得分:2)

正如已经提到的,这在文档中是开明的,请阅读它们,如果你不理解它们(这是可以理解的,因为HABTM部分有点令人困惑,需要一些试验和错误),告诉我们你究竟遇到了什么问题。

<强> http://book.cakephp.org/2.0/en/models/saving-your-data.html#saving-related-model-data-habtm

根据显示的示例,将多个X保存到Y的格式应为

Array
    (
        [Section] => Array
            (
                [id] => 1
            )
        [User] => Array
            (
                [User] => Array(3, 4)
            )
    )

相应的表格可能如下所示:

<?php echo $this->Form->create('User'); ?>
    <?php echo $this->Form->input('Section.id'); ?>
    <?php echo $this->Form->input('User', array('multiple' => 'checkbox')); ?>
<?php echo $this->Form->end('Add Users'); ?>

数据将通过Section模型保存,这样就可以正确更新其modified列。

public function addUsersToSection($id) {
    // ...
    if($this->request->is('post')) {
        if($this->Section->save($this->request->data)) {
            // ...
        } else {
            // ...
        }
    } else {
        $options = array(
            'conditions' => array(
                'Section.' . $this->Section->primaryKey => $id
            )
        );
        $this->request->data = $this->Section->find('first', $options);
    }

    $users = $this->Section->User->find('list');
    $this->set(compact('users'));
}

另一种方法是重组数组,如Vinay Aggarwal所示,效果很好,唯一的区别是它需要通过连接模型进行保存,因此它不会更新Section模型{{ 1}}列。

答案 1 :(得分:0)

CakePHP具有saveMany功能,如documentation中所述:

Model::saveMany(array $data = null, array $options = array())¶

答案 2 :(得分:0)

这是 HABTM 关系,首先您需要在SectionUser模型中设置关系。然后,您可以使用saveAll()方法一次保存所有记录。

Array
(
    [0] => Array
    (
        [user_id] => 33
        [section_id] => 9
    )

    [1] => Array
    (
        [user_id] => 33
        [section_id] => 10
    )
)

确保您的数据阵列采用上述格式。

$this->SectionUser->saveAll($data);