使用CakePHP 2.3。我正在创建一个应用程序,其中有一个Users表和一个Profiles表。该关联是这样的:用户hasOne个人资料/个人资料属于用户。
但是,我不希望用户有权添加他们的个人资料,因为这可能会生成他们个人资料的副本。我想要一个动作来编辑允许用户使用的ONE配置文件。
有没有办法使用user_id和id启动配置文件,但添加用户时所有其他字段都为空?这样,用户将自动拥有与注册相关联的配置文件,所需的只是编辑操作以填充空白字段。
如果我能以某种方式使配置文件表中的id和user_id具有相同的数字,那么它在CakePHP中会更加清晰。请注意,我还需要限制用户仅编辑其个人资料。
现在没有代码,只是希望你对此做出策略的意见,谢谢!
答案 0 :(得分:1)
您可以在创建用户时创建个人资料,只需执行
//your code for user saving
if($this->User->save())
$this->User->Profile->save(array('user_id'=>$this->User->id))
或者tada和tada的变体,保存空白配置文件。
事实上,如果您确定总是想要将配置文件添加到最近创建的用户,则可以在用户模型的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());
}
}
}
但请记住,如果您在个人资料模型中设置了验证,则会触发它们。假设您在配置文件中有一个列“作业”,该列不需要为空,然后会出现一些错误。您可以通过在验证过程中添加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”...不要这样做。真的没有必要。通过简单的查找,您可以轻松获得用户及其配置文件,让蛋糕处理外键。