aw-studio/laravel-bitflags

v0.1 2021-07-27 11:19 UTC

This package is auto-updated.

Last update: 2024-09-29 06:08:57 UTC


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);
}