Laravel 在迁移中给出数据类型位/字节

Ale*_*ilg 5 php database byte bit laravel

在laravel中是否有任何类似于位(字节)的数据库,在文档中找不到任何数据库。(https://laravel.com/docs/5.1/migrations)。

我尝试做类似的事情:

00000001 -> stands for something lets say playstation

00000010 -> stands for xbox

00000011 -> stands for both above
Run Code Online (Sandbox Code Playgroud)

pat*_*cus 2

您可以只使用整数和按位运算符,而不是尝试使用 BIT 数据类型(这会有点麻烦),假设一个字段不需要超过 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)
}
Run Code Online (Sandbox Code Playgroud)

要设置该字段,您所需要做的就是将位掩码添加在一起(在此配置中,ORing (|) 它们是相同的)。如果用户拥有 NES 和 PLAYSTATION:

$user->systems = Bitmask::NES + Bitmask::PLAYSTATION;
Run Code Online (Sandbox Code Playgroud)

要进行查询,您可以使用按位运算符。因此,如果您想要拥有 SEGA 的用户:

User::where('systems', '&', Bitmask::SEGA)->get();
Run Code Online (Sandbox Code Playgroud)

如果您想要拥有 PLAYSTATION 或 XBOX 的用户:

User::where('systems', '&', Bitmask::PLAYSTATION | Bitmask::XBOX)->get();
Run Code Online (Sandbox Code Playgroud)

&运算符将在整数字段和传入的整数之间执行按位 AND 运算。如果任何位匹配,则该&运算符将返回一个 > 0 的值,并且 where 子句将为真。如果没有位匹配,则&运算符将返回 0,并且 where 子句将为 false。