使用 Cake 2.4.5 保存用户和详细信息行

Posted

技术标签:

【中文标题】使用 Cake 2.4.5 保存用户和详细信息行【英文标题】:Saving User and Detail rows with Cake 2.4.5 【发布时间】:2014-02-24 23:00:25 【问题描述】:

我对蛋糕很陌生,我想知道如何创建新用户并创建联系方式

数据库是这样的

用户

user_id contact_detail_id 密码 role_id 用户名

Contact_Details

contact_detail_id 地址1 地址2

和许多其他领域

在用户模型中,我分配了 public $hasOne = array('ContactDetail');

因为用户会有一个联系方式

现在我需要知道的是,如何将它保存在 add 方法中,正如许多人所说的使用 saveassociated,尽管这似乎不起作用。

添加视图是这样的,据我了解这是正确的

<?php echo $this->Form->create('User', array('action' => 'add')); ?>
    <fieldset>
        <legend><?php echo __('Add User'); ?></legend>
    <?php
        echo $this->Form->input('User.username');
                echo $this->Form->input('User.password');
                echo $this->Form->input('roles');

                echo $this->Form->input('ContactDetail.name');
                echo $this->Form->input('ContactDetail.surname');
                echo $this->Form->input('ContactDetail.address1');
                echo $this->Form->input('ContactDetail.address2');
                echo $this->Form->input('ContactDetail.country');
                echo $this->Form->input('ContactDetail.email');
                echo $this->Form->input('ContactDetail.fax');


          ?>      
                <label>Are you interested in buying property in Malta?</label>
          <?php  
                $interest_buy = array('0'=>'no','1' => 'yes');
                echo $this->Form->input('ContactDetail.interest_buy_property',array('type'=>'radio','options'=>$interest_buy,'value'=>'0','legend'=>FALSE));
          ?>      
                <label>Are you interested in renting property in Malta?</label>
          <?php  
                $interest_rent = array('0'=>'no','1' => 'yes');
                echo $this->Form->input('ContactDetail.interest_rent_property',array('type'=>'radio','options'=>$interest_rent,'value'=>'0','legend'=>FALSE));
                echo $this->Form->input('ContactDetail.mobile');
                echo $this->Form->input('ContactDetail.phone');
                echo $this->Form->input('ContactDetail.postcode');
                echo $this->Form->input('ContactDetail.town');

                echo $this->Form->input('ContactDetail.newsletter',array('type'=>'checkbox','label'=>'Would you like to register for the newsletter?' ,'checked'=>'1','legend'=>FALSE,));
         ?>       

    </fieldset>
<?php echo $this->Form->end(__('Submit')); ?>

【问题讨论】:

【参考方案1】:

请先查看 Arun 说明,了解要在模型中放入什么,然后,您可以使用 $this-&gt;User-&gt;saveAll();或$this-&gt;User-&gt;saveAssociated(); 同时保存两个表。

如果你想先保存ContactDetail然后保存用户,你可以做第二个选项,但不推荐。

 $this->User->ContactDetail->create(); 
 $this->User->ContactDetail->save($this->request->data);`
 this->request->data['User']['contact_detail_id'] = $this->User->ContactDetail->id`;
 $this->User->Create();
 $this->User->save($this->request->data);`

但我更喜欢第一个选项,再次尝试第一个选项,

注意:请确保在用户模型中的模型中存在 ContactDetail 和用户关系

public $hasOne= array(
    'ContactDetail'   => array(
        'className' => 'ContactDetail',         
        'foreignKey' => 'contact_detail_id'
    )
);

希望对你有帮助。

【讨论】:

我想知道如果我需要保存contact_detail 然后用户,我将如何保存,因为我不断收到错误完整性约束违规:1452 无法添加或更新子行:外键约束失败(@987654325 @.users, 约束 FK_users_contact_details 外键 (contact_detail_id) 引用 contact_details (contact_detail_id) 我根据您的要求再次编辑了我的答案,尝试一下,如果有什么问题,请告诉我 该部分现在似乎可以工作了我在 role_id 上遇到错误我正在像这样在添加//Populate roles dropdownlist $roles = $this->User->Role->find 中填充它('list',array('order'=>'role')); $this->set(compact('roles'));然后当我要保存时,我尝试了这个 $this->request->data['User']['role_id'] = $roles->data;但它说违反完整性约束:1048 Column 'role_id' cannot be null 好吧,我刚才说的 $belogsto 设置不正确,因此绑定没有正确完成。现在我必须看看为什么 aro 会抛出错误。 AclNode::node() - 找不到由“Array ([Aro0.model] => Role [Aro0.foreign_key] => )”标识的 Aro 节点 我已接受您的回答,因为从技术上讲,它解决了我的问题,您可以救命。非常感谢。【参考方案2】:

在第一次查看你的数据库时,你应该使用以下数据库结构,这将帮助你更多的方向:

User Model

id
username
password
role_id

ContactDetail Model

id
user_id
address1
address2

User 模型中定义hasMany 模型关系与ContactDetail 类似:

$hasMany => array('ContactDetail');

现在使用(id =&gt; address1) 对填充一组联系人详细信息:

$this->ContactDetail->find('list', array('conditions' => array('user_id' => $user_id)),
                                         'fields' => array('ContactDetail.id', 'ContactDetail.address1')));

现在要保存关联的详细信息,请使用SaveAssociated Method。

【讨论】:

我的是 hasOne 我也认为蛋糕文档帮助很大,谢谢我现在知道该去哪里了。 除了保存之外,我几乎所有东西都在工作。我需要先保存联系人详细信息,然后再保存用户,从用户添加中。

以上是关于使用 Cake 2.4.5 保存用户和详细信息行的主要内容,如果未能解决你的问题,请参考以下文章

如何保存用户卡详细信息并稍后在 PayPal 中付款?

如何保存android应用程序的登录详细信息?

Cake php 4 使用数组中的关联保存数据

如何在 Cake 3.0 中保存 belongsToMany 数据?

CakePHP Master/Detail 表单 - 简单问题

如何获取保存的卡详细信息razorpay android