CakePHP:如何自动设置插入/更新的关联模型ID?

时间:2013-01-06 02:08:49

标签: php cakephp cakephp-appmodel

晚上好!我对CakePHP的魔力感到有些困惑。其中一些是惊人的,但有一点让我感到困惑。我有一个用户模型和一个关联的UserBasicInfo模型:

    class User extends AppModel {
        public $name = 'User';
        public $hasOne = array(
            'UserBasicInfo' => array(
                'className' => 'UserBasicInfo',
                'dependent' => true
            )
        );

class UserBasicInfo extends AppModel {
    public $useTable = 'users_basic_info';
    public $belongsTo = array(
        'User' => array(
            'className'    => 'User',
            'foreignKey'   => 'id'
        )
    );

关联很好,它会自动加入等等。在进行插入时,我如何告诉UserBasicInfo模型它的ID是什么,如果它有记录?它可能并不总是有记录,因为我没有强迫用户添加此信息,我不喜欢添加一个充满空白数据的记录。下面是我的UserController中的edit_basic_information方法:

    public function edit_basic_information($id = null) {
        $this->User->id = $this->Auth->user('id');

        $test = $this->User->read();

                    echo '<pre>';
            print_r($test);
            echo '</pre>';
        if (!$this->User->exists())
            throw new NotFoundException(__('Invalid user'));

        //if(empty($this->data))
//          $this->data = $this->User->findById($this->User->id);

        if ($this->request->is('post')) {
//          $success = false;
            $this->request->data['User']['id'] = $this->Auth->user('id');
//          $duplicate = $this->User->find('first', 
//              array(
//                  'conditions' => 
//                      array(
//                          'UserBasicInfo.user_id' => $this->Auth->user('id')
//                      )
//              )
//          );
            echo '<pre>';
            print_r($this->request->data);
            echo '</pre>';
//          if($duplicate) {
//              $success = $this->User->updateALL($this->request->data);
//          } else {
                $success = $this->User->saveALL($this->request->data, array('deep' => true));
//          }
            if ($success) {
                $this->Session->setFlash(__('The info has been saved'));
            } else {
                $this->Session->setFlash(__('The info could not be saved. Please, try again.'));
            }
        }
        $this->set('countries', $this->ChoicesCountries->find('list'));
    }

如上所述,我尝试过一些事情。有了Cake所具有的所有魔力,做一些类似额外数据库调用的重复检查让我觉得我做错了什么。此外,$ this-&gt;数据在提交时被覆盖 - 尽管预先填充以前的答案也是有益的。我还想添加一个隐藏的id字段,但是我只需添加验证,以确保ID与Auth id匹配。这不是一个问题,但似乎有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:0)

在更多地阅读了CakePHP文档之后,我意识到这有点愚蠢的问题。 save / saveALL方法仅取消我给它们的请求数据,这些数据只包含我在视图中指定的字段。它不会随意向request-&gt;数据数组添加数据。

我通过更改模型中的primaryKey解决了这个问题(不是问题的一部分,但是一旦我找到了解决方案就引起了问题),然后添加了

$this->request->data['UserBasicInfo']['user_id'] = $user['UserBasicInfo']['user_id'];

到方法。