1

さて、Cakephp 2.2.3 での私のプロジェクトでは、データベースとコントローラーをセットアップし、すべてをベイクしました。私はそれをすべて再確認し、すべてが機能しています(追加、編集、削除)。私がうまくいかないことの1つは、usersテーブルとテーブルの間の中間テーブルに保存することwebsitesです。中間テーブルはuser_websites. テーブルには、、 の3user_websitesつのフィールドしかありません。iduser_idwebsite_id

登録ユーザーとしてログインして Web サイトの追加ページに移動すると、Web サイトを問題なく追加できますが、テーブルにのみ保存され、websitesテーブルには何も保存されませんuser_websites。の add 関数をいじると、 をテーブルにWebsitesController保存できますが、 . 明らかに、新しいWebサイトを追加するときに、そのレコードをテーブルに保存し、現在ログインしているユーザーのIDと保存したばかりのレコードをテーブルに追加する必要があります。どんな助けでも大歓迎です。ありがとう!website_iduser_websitesuser_idwebsitesuser_websiteswebsite_id

これが私のコードです:

ユーザーモデル

public $hasMany = array(
    'UserWebsite' => array(
    'className' => 'UserWebsite',
    'foreignKey' => 'user_id',
    'dependent' => false,
    'conditions' => '',
    'fields' => '',
    'order' => '',
    'limit' => '',
    'offset' => '',
    'exclusive' => '',
    'finderQuery' => '',
    'counterQuery' => ''
    )
);

ウェブサイト モデル

public $hasMany = array(
    'UserWebsite' => array(
        'className' => 'UserWebsite',
        'foreignKey' => 'user_id',
        'dependent' => false,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    )
);

public $hasAndBelongsToMany = array(
    'User' => array(
        'className' => 'User',
        'joinTable' => 'users_websites',
        'foreignKey' => 'website_id',
        'associationForeignKey' => 'user_id',
        'unique' => 'keepExisting',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )
);

UserWebsite モデル

public $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Website' => array(
        'className' => 'Website',
        'foreignKey' => 'website_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

ウェブサイトコントローラー

public function add() {
    if ($this->request->is('post')) {

        $this->Website->create();
        if ($this->Website->UserWebsite->saveAll($this->request->data, array('deep' => true))) { 
    $log = $this->Website->getDataSource()->getLog(false, false);
    debug($log);
            $this->Session->setFlash(__('The website has been saved'));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The website could not be saved. Please, try again.'));
        }
    }

}
4

2 に答える 2

0

ただし、まだ適切な CakePHP の方法で行っているわけではありません。

hasMany を定義したため、現在のところ機能しているだけです。この場合、ここでは HABTM のみが必要なため、これは正しい関係ではありません。

テーブルの名前を次のように変更します。

users_websites

これは適切な CakePHP であり、ご覧のとおり、HABTM でも実際にこのように定義しています。

これで、hasMany をドロップできます。Cake は、現在行っている hasMany ではなく、HABTM を介して自動的に保存する必要があります。

user_id はフォーム/リクエストで定義されていないため、常に同じように定義する必要があります。

于 2012-12-08T13:03:09.403 に答える
0

そしてもちろん、助けを求めた直後に、私は仲間の助けを借りて問題を解決します. 答えが必要な人、またはより良い解決策がある人のために、私が追加したのは次のとおりです。

データの user_id を、現在ログインしているユーザーの ID に設定しました。これは、AppController の beforeFilter に設定されています。

ウェブサイトコントローラー

public function add() {
    if ($this->request->is('post')) {
        $this->Website->create();

        // This is the line I added
        $this->request->data['user_id'] = $this->Auth->user('id');

        if ($this->Website->UserWebsite->saveAll($this->request->data, array('deep' => true))) { 
            $this->Session->setFlash(__('The website has been saved'));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The website could not be saved. Please, try again.'));
        }
    }

}
于 2012-12-08T04:14:14.133 に答える