我有一个数据库,有一行名为user_role
。默认值设置为由我使用PHP
0
。
如果我想用像Member
或Admin
这样的字符串替换该0
,我可以写这样的东西吗:
$result_from_db = 0;
if($result_from_db == 0) {
$role = "Member";
} elseif($result_from_db == 1) {
$role = "Admin";
} else {
$role = "Invalid!";
}
echo $role; // Changes the value from DB to my custom string
虽然我可以在数据库中将0
重命名为Member
,但我想知道这样的事情是否可能。
您可以使用CASE
来执行此操作,请参阅 SQL CASE
SELECT id, name, user_role
CASE
WHEN user_role = 0 THEN "Member"
WHEN user_role = 1 THEN "Admin"
ELSE "Invalid!"
END AS user_role_string
FROM user_table;
是的,您可以使用CASE
语句对这些关联进行硬编码,但是否应该这样做是另一个问题。
您描述的是外键关系。 其中标识符0
的标签为'Member'
,标识符1
的标签为'Admin'
,等等。
如果将这些关联硬编码到它们的标签,则任何更改都需要复制到已使用硬编码的每个代码段中。 相反,为什么不直接有另一个角色表呢?
CREATE TABLE user_role (
id INT,
label VARCHAR(32),
is_admin INT,
is_super_user INT,
is_a_moomin INT,
PRIMARY KEY (id)
)
然后,您只需使用JOIN
来查找所需的标签或属性...
SELECT
user_table.*,
user_role.label AS user_role_label
FROM
user_table
INNER JOIN
user_role
ON user_role.id = user_table.role_id
此外,通过使用此表,您可以创建外键约束。
ALTER TABLE user_table ADD FOREIGN KEY fk_user_role (user_id) REFERENCES user_role (id)
然后数据库可以保证user_table.role_id
中的值必须存在于user_role.id
中。
这些都是关系数据库的用途以及它们如何工作的基本方面。 不同的数据库对这些数据库的语法略有不同。我强烈建议您研究它们并研究使用这些结构的数据库标准实践。
执行此操作的 SQL "关系方式"是拥有一个名为roles
的表,并使用user_role
列作为roles
表的外键从该表中提取数据。(非常简化的(表定义如下所示:
Table: roles
------------------
*id: int(10)
name: varchar(200)
其中id
是该表的主键。然后,若要获取用户及其角色,请执行以下查询:
SELECT * FROM users, roles WHERE users.user_role = roles.id AND (...any other conditions you have)
您可以向roles
表添加更多角色,SQL 语句仍将相同。