我们假设有一个表用户
id_user | name | id_state
1 | John | 2
和表user_state
id_status | description
2 | User Active
使用Codeigniter,与id_status相关的最佳方法是什么,而我的代码中没有整数硬编码? 例如:
if($user->id_status == 2){
// do something
}
...
实际上我已经在其他项目中使用了一个类来创建“枚举”:
Enum::Create('UserState', 'inactive', 'active', 'banned', 'deleted');
和他们..
echo UserState::GetDatabaseID(UserState::active); // result: 2
..我认为这是一个很好的解决方案,但我从未在Codeigniter项目中使用它
答案 0 :(得分:3)
我会在模型中创建一个查询两个表的方法,并返回一个具有status属性的对象,以便您可以访问状态的名称。我通常创建一个名称或 slug 字段作为小写名称,在我的代码中没有要引用的空格,并且* display_name *字段用于在视图中显示。
所以在你的模型中,做这样的事情:
public function get_user_info($user_id)
{
return $this->db
->select('user.*, user_state.*, user_state.id AS user_state_id') // to avoid a conflicts when referencing the ID
->where('id', $user_id)
->join('user_state', 'user_state.id = user.id_state')
->get('user')
->result();
}
然后,您可以在控制器中访问$user->status->slug
以引用“有效”状态或您想要的任何状态,然后在视图中$user->status->display_name
打印出用户友好名称。
答案 1 :(得分:0)
如果user_state表(几乎)永远不会更改且只有少量记录,您可以考虑将其从数据库中完全删除,只使用配置值。
答案 2 :(得分:0)
如果这个user_state表足够小(即< 10个状态),我会考虑在你的应用程序中放下一个数组。因此,在My_Model中定义一些高级属性,例如:
$this->user_states = array(
'active'=>2,
'deleted'=>3,
'new'=>4,
'verified'=>5
);
然后在您的代码中,您只需使用类似
的内容if ($this->id_status == $this->user_states['active']) {
}