在cakephp中一次创建多个模型

时间:2014-05-21 08:41:05

标签: php cakephp

我想要达到的目的是立即注册UserFirm。所以我需要插入3个表:usersfirmsfirms_users。 CakePHP应该自动执行此操作,因为我在模型中设置了$hasAndBelongsToMany关联。但是在注册期间,只有users表被写入。我错过了什么吗?

注册表

<div class="users form">
<?php echo $this->Form->create('User'); ?>
    <fieldset>
        <legend><?php echo __('Add User'); ?></legend>
        <?php 
        echo $this->Form->input('User.email', array('type' => 'email')); //standard HTML5 email validation
        echo $this->Form->input('User.password');
        echo $this->Form->input('Firm.0.name');
        echo $this->Form->input('Firm.0.zipcode');
    ?>
    </fieldset>
<?php echo $this->Form->end(__('Submit')); ?>
</div>

User模型的相关部分

public $hasAndBelongsToMany = array(
    'Firm' => array(
        'className' => 'Firm',
        'joinTable' => 'firms_users',
        'foreignKey' => 'user_id',
        'associationForeignKey' => 'firm_id',
        'unique' => 'keepExisting',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
    ),

以及Firm模型的相关部分

class Firm extends AppModel {

public $hasAndBelongsToMany = array('User'=>array('className'=>'User'));

最后是UsersController / show_reg_form动作

public function show_reg_form(){
        if ($this->request->is('post')) {
            $this->loadModel('Firm');
            $this->User->create();
            $this->Firm->create();
            if ($this->User->saveAll($this->request->data)) {
                $this->Session->setFlash(__('The user has been saved'));
                return $this->redirect(array('action' => 'loggedin','loggedin'));
            }
            $this->Session->setFlash(
                __('The user could not be saved. Please, try again.')
            );
        }
}

4 个答案:

答案 0 :(得分:1)

应该是

echo $this->Form->input('Firm.name');
echo $this->Form->input('Firm.zipcode');

答案 1 :(得分:1)

为了使用hasAndBelongsToMany关联保存,你应该有这样的数组来保存记录

Array
(
    [User] => Array
        (
            [field_1] => 1
            [field_2] => 2
            [field_3] => 3
            [field_4] => 4
        )

    [Firm] => Array
        (
            [0] => 5
            [1] => 8
            [2] => 4
        )

)

其中5,8,4是公司表的记录ID

我认为这不是你要找的情况, 我建议你仔细阅读

  • hasMany关联,如果用户有多家公司public $hasMany = array('Firm');
  • hasOne关联,如果用户只有一家公司public $hasOne = array('Firm');

以便在创建用户时添加公司

答案 2 :(得分:1)

您只能使用一个saveAll来保存所有三个表中的数据。 首先,您需要保存公司记录,然后将新生成的公司ID分配为$ this-&gt;数据中的隐藏字段,并使用saveAll保存用户模型数据。然后数据将进入名为firm_users的第三个表中。 您可以查看以下链接以获取更多信息

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

答案 3 :(得分:1)

我认为此代码可以正常使用

public function show_reg_form(){
        if ($this->request->is('post')) {
            $this->User->create();
            if ($this->User->save($this->request->data)) {
                 $this->Firm->create();
                 if($this->Firm->save($this->request->data))
                 $this->Session->setFlash(__('The user has been saved'));
                 return $this->redirect(array('action' => 'loggedin','loggedin'));
            }
             else{
             $this->Session->setFlash(
                __('The user could not be saved. Please, try again.')
            );
           }
        }
  }