0

これを構築しようとしたときに、見落とした (または根本的に誤解した!) ことに行き詰まっています。

Accounts HABTM Users
Administrators belongsTo Accounts、ここで
Administratorは のエイリアスですUser

私はRDBMSがかなり苦手なので、さらに明確にするために:

アカウント フィールド: id, name, administrator_id, etc.
ユーザー フィールド: id, name, dob, etc.
AccountsUsers フィールド: id, user_id, account_id

モデルの関連付けに関しては、次のものがあり
ます。

    public $hasOne = array(
        'Account' => array(
            'className' => 'Account',
            'foreignKey' => 'administrator_id'
        )
    );

    public $hasAndBelongsToMany = array(
        'Account' =>
            array(
                'className' => 'Account',
                'joinTable' => 'users_accounts',
                'foreignKey' => 'user_id',
                'associationForeignKey' => 'account_id',
                'unique' => true,
                'conditions' => '',
                'fields' => '',
                'order' => '',
                'limit' => '',
                'offset' => '',
                'finderQuery' => '',
                'with' => ''
            )
    );

アカウント

public $belongsTo = array(
        'Administrator' => array(
            'className' => 'User',
            'foreignKey' => 'id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );
public $hasAndBelongsToMany = array(
    'User' => array(
        'className' => 'User',
        'joinTable' => 'users_accounts',
        'foreignKey' => 'account_id',
        'associationForeignKey' => 'user_id',
        'unique' => 'keepExisting',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
    )
);

ただし、私のAccountsコントローラーは、次のようなコードを生成するために焼き付けられました。

$this->Administrator->find('list');

しかし、もちろん、管理者のコントローラーがないため、次のものが残されています。

エラー:オブジェクト以外の
ファイルでメンバー関数 find() を呼び出しています: path/to/app/Controller/AccountsController.php

ACL を個別に設定しました。この場合の「管理者」は、承認の観点からユーザーのクラスを表しているのではなく、関連付けにすぎません。おそらく、「所有者」に似ています。別のモデルを作成する理由はありません。アカウントを作成した 1 人のユーザーと、それを使用する他のユーザーを区別したいだけです (もちろん、作成者もほぼ確実にそれを使用します)。としてフィールドを離れていただければ幸いAccountsです。user_idこれが問題を引き起こさない場合はデータベース上で、しかし(私には)バインドされているようです。

追加の問題は、私UsersController
$this->User->saveAssociated($this->request->data)
.

ここに私のビューファイルがあります:

<?php echo $this->Form->create('User', array('action' => "register/$token_id/$group_id/$account_id")); ?>
    <fieldset>
        <legend><?php echo __('Registration'); ?></legend>
    <?php
        echo $this->Form->input('email');
        echo $this->Form->input('password');
        echo $this->Form->input('firstname');
        echo $this->Form->input('lastname');
        echo $this->Form->input('claimed', array('type'=>'hidden', 'value'=>1));
        echo $this->Form->input('studentno');
        echo $this->Form->input('UsersAccount.account_id', array('type'=>'hidden', 'value'=>$account_id));
    ?>
    </fieldset>
<?php echo $this->Form->end(__('Submit')); ?>

saveAssociated()手動で次のようなことをしなくても済むようにするためだったのは、まさに私の理解でした。

$UserId = $this->User->getLastInsertID();
$AccountId = $this->request->data['UsersAccount']['id'];
$this->User->loadModel('UsersAccount');
$this->UsersAccount->create();
$this->UsersAccount->save(array('UsersAccount' => array(
                                        'user_id' => $UserId, 
                                        'account_id' => $AccountId)
));

私のエラーは主に関係を理解することにあると確信しています(つまり、ここには論理的な問題がありますが、構文の問題ではありません)。私は Cake のマニュアルをかなり広範囲に読みましたが、Cake がこれをどのように実行したいのか理解できません。Cake の優雅さを回避するハックを構築するよりも、正しい方法を学びたいと思っています。ですから、助けていただければ幸いです。:)

4

1 に答える 1

1
  • Accounts コントローラーで、$uses 配列を明示的に宣言することを期待すると、Accounts モデルを経由して Administrator モデルをプルする必要があります。

    $this->Account->Administrator->find('list');

  • 関連付けを処理するには、saveAssociated パラメータでディープ キーを true に設定する必要があります。

    $this->User->saveAssociated($this->request->data, array('deep' => true));

注: saveAssociated は、HABTM を除くすべてのアソシエーションで機能します

于 2013-11-14T13:36:11.273 に答える