CakePHP 2.4: Настройка моделей с помощью HABTM assoc. и принадлежит доц. через псевдоним модели, а затем сохранить работу saveAssociated()

Я застрял на том, что упустил из виду (или принципиально неправильно понял!), Пытаясь построить это:

Accounts HABTM Users и
Administrators belongsTo Accounts, где
Administrator — псевдоним для User.

Я довольно плохо разбираюсь в СУБД, поэтому для дальнейшего уточнения:

Поля учетной записи: 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. Итак, помощь очень ценится. :)


person Jonline    schedule 14.11.2013    source источник


Ответы (1)


  • в вашем контроллере учетных записей, ожидайте, что вы явно уберете свой массив $uses, вам придется пройти через модель учетных записей, чтобы вытащить свою модель администратора.

    $this->Учетная запись->Администратор->find('list');

  • вам нужно будет установить для своего глубокого ключа значение true в параметре saveAssociated, чтобы он работал с ассоциациями.

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

ПРИМЕЧАНИЕ. saveAssociated работает со всеми ассоциациями, кроме HABTM.

person Ayo Akinyemi    schedule 14.11.2013
comment
Красота, спасибо за это; псевдоним теперь работает, и я больше не буду пытаться сохранить отношение HABTM с помощью saveAssociated(). Предположительно, чтобы сохранить отношения HABTM, я действительно просто строю их из данных запроса в действии контроллера и создаю(), сохраняю() их? - person Jonline; 15.11.2013
comment
пройти через модель с помощью HABTM для сохранения, так как ассоциации в этой модели будут принадлежать правильно? - person Ayo Akinyemi; 15.11.2013