2013-06-04 2 views
0

Использование CakePHP 2.3. Я создаю приложение, в котором есть таблица Users и таблица Profiles. Ассоциация такова: пользователь hasOne Профиль/Профиль принадлежит пользователю.CakePHP hasOne принадлежит для отношений, редактировать/добавлять такое же действие

Однако, я бы не хотел, чтобы у пользователей был доступ, чтобы добавить их профили, так как это может привести к копированию их профилей. Я хочу, чтобы одно действие редактировало один профиль, разрешенный Пользователем.

Есть ли способ инициировать профиль с user_id и id, но все остальные поля пусты, когда пользователь добавлен? Таким образом, у пользователя автоматически будет профиль, связанный с регистрацией, и все, что вам нужно, - это действие редактирования для заполнения пустых полей.

Также было бы намного чище в CakePHP, если бы я мог каким-то образом сделать id и user_id в таблице профилей одинаковым числом. Имейте в виду, что мне также необходимо ограничить пользователей редактированием только их профилей.

На данный момент код отсутствует, просто хотел, чтобы ваше мнение о стратегии для этого, спасибо!

ответ

1

Вы можете создать профиль на создание пользователя, просто сделать

//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» в профилях ... не делайте этого. На самом деле нет необходимости. С помощью простой находки вы без проблем получаете пользователя и его профиль, позволяя дескрипту обрабатывать внешние ключи.

+1

Большое вам спасибо, это отличный ответ и именно то, что я хотел – user2033570

+0

Рад, что я мог помочь :) – Nunser