CakePHP 2.4:通过模型别名设置同时具有HABTM接口和归属To接口的模型,并随后进行saveAssociate



在尝试构建它时,我被困在我忽略(或从根本上误解!)的东西上:

Accounts HABTM Users
Administrators belongsTo Accounts ,其中
AdministratorUser 的别名。

我在RDBMS上非常糟糕,所以进一步澄清一下:

科目字段: id, name, administrator_id, etc.
用户字段: id, name, dob, etc. 帐户用户字段: 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;在这种情况下,"管理员"在授权方面并不代表一类用户,只是关联——它可能更像是"所有者"。我没有理由为他们创建一个单独的模型,我只是想区分创建帐户的用户和将使用它的其他用户(当然,创建者几乎肯定会使用它)。我很乐意离开这个领域,就像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优雅的黑客。所以,非常感谢帮助。:)

  • 在你的账户控制器中,期望你显式地破坏你的$uses数组,你必须通过账户模型来拉取你的管理员模型。

    $this->帐户->管理员->查找('列表');

  • 您必须在 saveAssociated 参数中将深层密钥设置为 true,才能与关联一起使用。

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

注意:保存除HABTM以外的所有关联作品

最新更新