aw-studio / laravel-bitflags
v0.1
2021-07-27 11:19 UTC
Requires
- php: ^8.0
- illuminate/support: ^8
Requires (Dev)
- mockery/mockery: ^1.4
- orchestra/testbench: ^6.19
- phpunit/phpunit: ^9.5
README
从单个数据库列存储和接收位标志。
安装
composer require aw-studio/bitflags
用法
想象一下,你想要在一个 status(int)
列中存储多个状态标志,这个标志可以在你的 Email
模型中实现。这可以通过使用位操作来创建一个代表 位掩码
来实现。为了启用位操作,所有的 bitflags
必须都是2的幂(1, 2, 4, 8, 16 ...)。你还应该确保将列正确地强制转换为 Bitflags::class
。
class Email extends Model { // Email status flags, all powers of 2 public const SENT = 1; public const RECEIVED = 2; public const SEEN = 4; public const READ = 8; protected $fillable = ['status']; public $casts = [ 'status' => Bitflags::class ]; }
向位掩码中添加标志
可以使用 addBitflag()
辅助函数向位掩码中添加 bitflag
public function markRead() { $this->update([ 'status' => addBitflag(self::READ, $this->status) ]); }
你还可以一次性添加多个标志
$this->update([ 'status' => addBitflag([self::READ, self::SEEN], $this->status) ]);
从位掩码中移除标志
可以使用 removeBitflag()
辅助函数从位掩码中移除 bitflag
public function markUnread() { $this->update([ 'status' => removeBitflag(self::READ, $this->status) ]); }
一次性移除多个标志
$this->update([ 'status' => removeBitflag([self::READ, self::SEEN], $this->status) ]);
查询位标志
要检查位标志是否包含在位掩码中,可以使用以下查询方法
public function scopeRead($query) { return $this->whereBitflag('status', self::READ); } public function scopeUnread($query) { return $this->whereBitflagNot('status', self::READ); } public function scopeSeenOrRead($query) { return $this->whereBitflagIn('status', [self::READ, self::SEEN]); } public function scopeSeenAndRead($query) { return $this->whereBitflags('status', [self::READ, self::SEEN]); }
访问器
为了获取单个标志属性,你可以准备以下访问器
protected $appends = ['read']; public function getReadAttribute() { return inBitmask(self::READ, $this->status); }