我有表用户,其中包含用户名,密码和类型字段。类型可以是这些员工,供应商和客户的任何一个或组合,即用户可以是供应商或客户两者或某些其他组合。对于类型字段,我使用了多个复选框,请参阅下面的代码。这是views / users / add.ctp文件
形状配合>创建( '用户');?> 形状配合>输入( '用户名'); echo $ this-> Form-> input('password'); echo $ this-> Form-> input('type',array('type'=>'select','multiple'=>'checkbox','options'=> array( 'client'=> '客户', 'vendor'=> “供应商”, 'employee'=> '雇员' ) )); ?> Form-> end(__('Submit',true));?>这是我在模型文件中使用的代码。一个回调方法beforeSave 应用程序/模型/ user.php的
function beforeSave(){ if(!empty($ this-> data ['User'] ['type'])){ $ this-> data ['User'] ['type'] = join(',',$ this-> data ['User'] ['type']); } 返回true; } 此代码将多个值保存为db。中的逗号分隔值。
当我编辑用户时,主要问题出现了。如果用户在用户创建期间选择了多种类型,则无法找到为该用户类型选中的复选框。
答案 0 :(得分:3)
你永远不应该在字段中保存序列化数据,json或csv。这会让你的生活变得艰难。
虽然habtm是一种做事方式,但如果您的二进制数学是合理的,您可能需要为此检查位掩码。这是一篇很棒的帖子http://mark-story.com/posts/view/using-bitmasks-to-indicate-status
基础知识 1 =员工 2 =供应商 4 =客户 // 8 = next_type
然后,如果用户是类型员工&供应商的类型将是3(1 + 2),如果它是供应商&客户端类型为6(2 + 4)
正如你所看到的那样,没有办法将它混淆,并且在mysql中按位运行相当不错,所以发现很容易。有关详细信息,请参阅帖子
答案 1 :(得分:0)
您应该有一个表types
和一个联接表users_types
你所看到的是一个HABTM relationship,所以你应该像一个人一样处理它
在加入UsersType
模型中,您应添加custom validation rule,以检查是否允许当前的类型组合。
答案 2 :(得分:0)
如果要在数据库中找到数据后修改数据,可以在模型中使用afterFind()
回调。
所以在你的情况下,把这样的东西放在你的用户模型中:
function afterFind($results) {
$results['User']['type'] = explode(',', $results['User']['type']);
return $results;
}
CakePHP手册中有more info on afterFind。
话虽如此,可能值得考虑另一种方法,如HABTM关系,如上面首先提出的deceze。