0

ユーザーがデータベースの users テーブルに保存されたデータに登録できる簡単なアプリケーションを CakePHP で作成しています。また、ユーザーに関連付けられたプロファイルもあり、$hasOne と $belongsTo の関連付けを利用してこれを達成しようとしています。ユーザーには 1 つのプロファイルがあり、プロファイルはユーザーに属します。

id、user_id、およびプロファイルのその他のフィールドを含むプロファイル テーブルを作成しました。user_id はプロファイルの ID を参照します。しかし、ビューでプロファイル情報を編集しようとすると、情報を更新できません。ユーザー テーブルのユーザー 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 と同じ 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 に答える