0

我正在用 CakePHP 构建一个简单的应用程序,用户可以在其中注册保存在我的数据库的 users 表中的数据。他们还有一个与用户关联的个人资料,我试图通过利用 $hasOne 和 $belongsTo 关联来实现这一点。用户拥有一个个人资料,个人资料属于该用户。

我创建了一个配置文件表,其中包含 id、user_id 和配置文件的其他字段。user_id 引用配置文件的 id。但是,当我尝试在视图中编辑配置文件信息时,我无法更新信息。我收到一条错误消息,指出它正在尝试复制与 User 表中的 User id 对应的“id”。我在 UsersController.php 中编写 profile_edit 函数,代码如下:

public function profile($id = null) {
    $this->User->id = $id;

    if (!$this->User->exists()) {
        throw new NotFoundException('Invalid user');
    }

    if ($this->request->is('post') || $this->request->is('put')) {
        if ($this->User->save($this->request->data)) {
            $this->request->data['Profile']['user_id'] = $this->User->id;
            $this->User->Profile->save($this->request->data);
            $this->Session->setFlash('Your profile has been updated');
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash('The profile could not be saved. Please, try again.');
        }
    } else {
        $this->request->data = $this->User->read();
    }
}

我的 Profile.php 模型文件:

 <?php
   class Profile extends AppModel {
    public $name = 'Profile';
    public $belongsTo = 'User'; 
   }
   ?>

我的意见文件:

<div class="profiles form">
<?php echo $this->Form->create('User');?>
    <fieldset>
        <legend>Edit Profile</legend>
    <?php
        echo $this->Form->input('Profile.regulator_number');
        echo $this->Form->input('Profile.website');
        echo $this->Form->input('Profile.minimum_account');
    ?>
    </fieldset>
<?php echo $this->Form->end('Submit');?>
</div>
<div class="actions">
    <h3>Actions</h3>
    <ul>
        <li><?php echo $this->Html->link('List Users', array('action' => 'index'));?></li>
    </ul>
</div>

我希望能够更新每个用户的个人资料信息,无论他们是否填写了任何内容。注意:如果新用户注册并且还没有任何个人资料信息,则提交工作正常。只有更新搞砸了。我是否可能需要在用户注册后立即将 user_id 添加到配置文件表中,到目前为止,新注册的用户可能在用户表中有信息,但在配置文件表中没有。

在此先感谢您的帮助。

4

1 回答 1

0

更改此行

$this->request->data['Profile']['user_id'] = $this->User->id;

$this->request->data['Profile']['user_id'] = $id;

这就是为什么。它适用于您的 create cuz $this->User->id 将为您提供在 User 表中创建的最后一个 ID。类似于 $this->User->getLastInsertID();

在编辑时,您希望使用相同的 id,它是您最初作为参数传递的那个。

还可以考虑将其他选项添加到模型中,即其他外键等以完全建立您的关系。

来自网站的示例

class Profile extends AppModel {
    public $belongsTo = array(
        'User' => array(
            'className'    => 'User',
            'foreignKey'   => 'user_id'
        )
    );
}

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

于 2013-05-07T22:17:53.987 回答