Я застрял на том, что упустил из виду (или принципиально неправильно понял!), Пытаясь построить это:
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. Итак, помощь очень ценится. :)