Codeigniter中的枚举表行ID

时间:2011-11-18 19:44:44

标签: php codeigniter

我们假设有一个表用户

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项目中使用它

3 个答案:

答案 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']) {
}