Вы можете создать профиль на создание пользователя, просто сделать
//your code for user saving
if($this->User->save())
$this->User->Profile->save(array('user_id'=>$this->User->id))
или изменения, что и тада, пустой профиль сохранить.
В самом деле, если вы уверены, что вы всегда хотите добавить профиль в недавно созданный пользователем, вы можете сделать это в afterSave модели пользователя.
class User extends AppModel {
public function afterSave($created) {
//make sure to do it on creation and not on update
if ($created) {
$this->Profile->save(array('user_id'=>$this->getLastInsertID());
}
}
}
Но имейте в виду, что если у вас есть проверки, установленные в вашей модели профиля, это вызовет их. Допустим, у вас есть столбец «задание» в профиле, для которого не должно быть null, тогда появятся некоторые ошибки. Вы можете обойти это путем добавления параметра on
в процессе проверки
class Profile extends AppModel {
public $validate = array(
'job' => array(
'notempty' => array(
'rule' => array('notempty'),
'message' => 'You have to have a job',
'allowEmpty' => false,
'required' => true,
'on' => 'update'
)
),
/* etc */
}
Другой вариант, это просто ... не делать что :) Если вы не хотите, чтобы пользователь, чтобы добавить профили, как сумасшедший, вы можете «hardcode» - это идентификатор пользователя для профиля. Например, предположим, что у вас есть действие добавить в контроллере профиля
class ProfilesController extends AppController {
public function add($user_id) {
//lets assume you have the user id somewhere, maybe even get the logged session one
if($this->request->is('post')) {
//when you are saving, force the add (or edit) to be for the user_id, not anyone
$this->request->data['Profile']['user_id'] = $user_id;
$this->Profile->save();
}
}
С несколькими МФС здесь и там, нет никакой необходимости, чтобы создать пустой профиль только после создания пользователя. Но это тоже не повредит ...
Лично мне нравится опция afterSave, если вы уверены, что хотите добавить пустой профиль во все случаи создания пользователя. Меньше кода в контроллере, но вы должны быть более осторожны с проверкой профилей.
О, и о «том же id и user_id» в профилях ... не делайте этого. На самом деле нет необходимости. С помощью простой находки вы без проблем получаете пользователя и его профиль, позволяя дескрипту обрабатывать внешние ключи.
Большое вам спасибо, это отличный ответ и именно то, что я хотел – user2033570
Рад, что я мог помочь :) – Nunser