0

最初に簡単な説明。モデル化する必要があります:アカウントとユーザー、およびそのアカウントの結合テーブル。モデルには、各モデルに多対多の関連付けがあります。

ユーザーモデル:

    'Account' => array(
        'className' => 'Account',
        'joinTable' => 'accounts_users',
        'foreignKey' => 'user_id',
        'associationForeignKey' => 'account_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )

アカウントモデル:

        'User' => array(
        'className' => 'User',
        'joinTable' => 'accounts_users',
        'foreignKey' => 'account_id',
        'associationForeignKey' => 'user_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )

今、私はこの2つの間の関係を、既存のすべてのエントリからの結合テーブルacccounts_usersに手動で保存しようとしています。ここに私のコードがあります

        $account = base64_decode($this->params['pass']['0']);
    $token = $this->params['pass']['1'];


    if($user = $this->User->findByToken($token))
    {
        // ZUr test zwecken
       # $this->User->query(" INSERT INTO accounts_users (account_id ,user_id) VALUES (222, 223); ");
        $aId = $this->Account->findById($account);
        $this->data['User'][0]['user_id'] = $user['User']['id'];
        $this->data['Account'][0]['account_id'] = $aId['Account']['id'];



        $this->User->bindModel(array(
            'hasMany' => array('AccountsUser')
        ));
        $this->User->saveAll($this->data, array('validate' => false));


        print_r('gefunden'); die;
        $this->Redirect->flashSuccess('Account Invitation successfull. Log In!', array('controller' => 'users', 'action' => 'login'));
    }
    else
    {
        print_r('nicht gefunden'); die;
        // user nicht gefunden zum login umleiten
        $this->Redirect->flashWarning('Account Invitation error. Please try again!', array('controller' => 'users', 'action' => 'login'));

    }

結果はaccounts_usersテーブルの新しいエントリですが、user_idは0です。正しく渡されたためにユーザーIDが欠落している理由がわかりません。データ配列にいくつかのIDを手動で渡しても、ユーザーIDなしでaccount_idだけを書き込みます。

アップデート

モデルを少し試して、アカウントモデルを介してaccounts_usersにデータを保存しました。更新されたコードを参照してください。

            $this->data['User']['id'] = $user['User']['id'];
        $this->data['Account']['id'] = 33; #$aId['Account']['id'];

        $this->Account->AccountsUser->create();

        $this->Account->saveAll($this->data, array('validate' => false));

そのため、スクリプトは両方のIDを挿入しますが、同じアカウントIDを持つ別のユーザーからのエントリがある場合、そのユーザーは上書きされます。他のものはすべて機能します。新しいユーザーの軸アカウントIDを使用して新しいエントリを作成する方法を考えている人はいますか?

これは私が得るmysqlクエリです:

UPDATE accountsSET id=33WHERE accountsid= 33

SELECT AccountsUseruser_idFROMASWHERE 。accounts_users_ AccountsUser _ = 33AccountsUseraccount_id

DELETE AccountsUserFROMASWHERE 。accounts_users_ AccountsUser _ = 33 ANDAccountsUseraccount_id

INSERT INTO accounts_usersaccount_iduser_id)VALUES(33、 '32')

アイデアを出す人はなぜですか?前もって感謝します

4

1 に答える 1

1

CakePHP 1.x は、HABTM 結合テーブルをまったく「ばかげた」ものとして扱います。既存のレコードをすべて削除し、新しいレコードを挿入して置き換えます。結合テーブルにも追加データが含まれている場合、これは主要な PITA です。( beforeSave() コールバックにコードを追加することで、これを防ぐことができます)

keepExistingCakePHP 2.1 にはHABTM リレーションのオプションがあります。このオプションは、CakePHP が JOIN テーブルのレコードを削除するのを防ぎます。これが新しいプロジェクトである場合は、CakePHP 1.x から大幅に改善されているため、CakePHP 2.x を使用することをお勧めします。

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasmany-through-the-join-model

結合テーブルにデータを保存するためのヒントは、ここにあります。

http://book.cakephp.org/2.0/en/models/ Saving-your-data.html# Saving-hasmany-through-data

CakePHP 1.3 の場合 (HABTM が複雑になる場合は以下を参照)

http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Models.html# Saving-related-model-data-habtm

于 2013-03-07T21:47:40.937 に答える