我目前正在查看自己编写的代码,并试图提高其可读性和质量。这是一个如何解决一个简单问题的示例,我一直觉得这是一个糟糕的解决方案。
具有以下“状态”或本示例中的海拔级别的用户表
(这些可以是任何东西,例如,一个项目可以具有“未完成”,“暂停”和“完成”状态)
过去,我总是将其存储为INT值,然后在打印出帐户及其状态时,我将编写一个函数将此功能转换回文本,以打印在页面上,例如
if userLevel === 3 { return "Admin"; };
这一直感觉是一个不好的解决方案,而且也不是很灵活。添加任何新类型的帐户都将需要更新功能。这种格式也使阅读页面限制变得非常困难。
如果我要添加以下行:
if userLevel !== 2 OR 3 { // Redirect to error page };
您会看到,这怎么可能使线路混乱。
最近,我已经开始纯粹将这些“状态”存储为字符串,以使其更具可读性。但是现在我对Laravel有了更多的了解,我想知道是否应该有专门用于此目的的其他数据库表。
所以我的问题-这种数据合适的数据类型是什么,与之交互的理想方式是什么?
答案 0 :(得分:0)
在旧版代码中,我将使用常量,基本上位实际上与其中的哪种数据无关紧要。它可读性强,您可以轻松找到用法,IDE可以帮助您。
在具有大量业务逻辑的新代码中,可以创建一个代表状态的小类,以便可以将逻辑放在那里。
在DB中-您可以找到几篇文章,指出枚举不是一个好主意。如果您想优化很多,tinyint可以为您提供帮助,但是使用短字符串也可以(我通常会使用它)。然后,您应该将其翻译为php ofc,我建议上述对象方法。
答案 1 :(得分:0)
这可能适合或不适合您的特定应用程序,但是我经常发现按位操作对于在单个整数中具有0 or more
属性很方便。
例如假设您分配了以下内容:
$admin = 0b1; //(1)
$employee = 0b10; //(2)
$supervisor = 0b100; //(4)
现在您要为$status
分配一个整数值,该值是按位的or
适当值。
因此,主管是employee
和supervisor
,因此他们的整数值为
2|4 = 0b010 | 0b100 = 0b110 = 6
。
现在,当您想查看用户是否有status
时,只需屏蔽以下内容即可:
if(($statusInt & $supervisor) != 0){
// it is a supervisor... //maybe more, at least supervisor
}
您当然可以通过这种方式在单个整数或INT数据库列中包含更多statuses
。