0

使用 CakePHP 2.3。我正在创建一个应用程序,其中有一个用户表和一个配置文件表。关联是这样的:User hasOne Profile / Profile belongsTo User。

但是,我不希望用户有权添加他们的个人资料,因为这可能会产生他们个人资料的副本。我想要一个操作来编辑允许用户的 ONE 配置文件。

有没有办法使用 user_id 和 id 启动配置文件,但在添加用户时所有其他字段都为空?这样,用户将在注册时自动拥有关联的个人资料,并且所需要的只是编辑操作以填写空白字段。

如果我能以某种方式使配置文件表中的 id 和 user_id 具有相同的数字,那么在 CakePHP 中也会更干净。请记住,我还需要限制用户只能编辑他们的个人资料。

暂时没有代码,只是想了解您对执行此操作的策略的意见,谢谢!

4

1 回答 1

1

您可以在创建用户时创建配置文件,只需执行

//your code for user saving
if($this->User->save())
   $this->User->Profile->save(array('user_id'=>$this->User->id))

或者那个和tada的变体,空白配置文件被保存。

事实上,如果你确定你总是想为最近创建的用户添加配置文件,你可以在User 模型的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());
        }
    }
}

但请记住,如果您在 Profile 模型中设置了验证,这将触发它们。假设您在个人资料中有一个“工作”列,要求不能为空,那么就会出现一些错误。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 */
}

其他选择是简单地......不要那样做:)如果您不希望用户疯狂地添加配置文件,您可以将其用户 ID“硬编码”到配置文件中。例如,假设您在配置文件控制器中有一个添加操作

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();
         }
     }

在这里和那里有一些 ifs,没有必要在创建用户之后创建空白配置文件。不过也不痛...

如果您确定要在所有用户创建案例中添加空白配置文件,我个人喜欢 afterSave 选项。控制器中的代码更少,但您必须更加小心您的配置文件验证。

哦,关于配置文件中的“相同的 id 和 user_id”……不要那样做。没必要,真的。通过简单的查找,您可以毫无问题地获得用户及其个人资料,让 cake 处理外键。

于 2013-06-04T16:52:02.583 回答