假设您不需要为一个字段提供超过 32 个选项(bigint = 8 字节 = 32 位)。
作为一个非常简单的示例,假设您创建了以下枚举类:
class Bitmask {
const ATARI = 1 << 0; // 00000001 (1)
const NES = 1 << 1; // 00000010 (2)
const SNES = 1 << 2; // 00000100 (4)
const SEGA = 1 << 3; // 00001000 (8)
const PLAYSTATION = 1 << 4; // 00010000 (16)
const XBOX = 1 << 5; // 00100000 (32)
}
要设置字段,您只需将位掩码添加在一起(在此配置中,ORing (|) 它们是相同的)。如果用户有 NES 和 PLAYSTATION:
$user->systems = Bitmask::NES + Bitmask::PLAYSTATION;
要查询,您将使用按位运算符。因此,如果您想要拥有 SEGA 的用户:
User::where('systems', '&', Bitmask::SEGA)->get();
如果您想要拥有 PLAYSTATION 或 XBOX 的用户:
User::where('systems', '&', Bitmask::PLAYSTATION | Bitmask::XBOX)->get();
& 运算符将在整数字段和您传入的整数之间执行按位与运算。如果任何位匹配,& 运算符将返回一个 > 0 的值,而 where 子句将说实话。如果没有一个位匹配,& 运算符将返回 0,where 子句将为 false。