Laravel 中使用 artisan make:cast 命令创建和使用类型转换器
将货币值存储为整数(而不是浮点),以避免舍入和精度问题——这是 Laravel 社区广泛接受的方法。然而,这需要在 Laravel 中创建一个强制转换,在检索时将浮点转换为整数,在存储在数据库中时将其转换回整数。使用以下artisan命令创建强制转换
在Laravel中, artisan make:cast
命令用于生成一个新的类型转换器(Cast)。类型转换器允许你定义模型属性在存储到数据库之前和从数据库检索后的转换方式。
使用 make:cast
命令可以创建一个新的Cast类,并将其放置在 App\Casts
目录下。
要创建一个Cast,可以通过运行以下命令:
php artisan make:cast MoneyCast
这将在 App\Casts
目录下创建一个名为 MoneyCast
的新Cast类。
在生成的Cast类中,你可以定义一个 get
方法来转换从数据库中检索到的值,以及一个 set
方法来转换存储到数据库之前的值。
例如,以下是一个简单的Cast示例,将存储在数据库中的JSON字符串转换为数组:
namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
class MoneyCast implements CastsAttributes
{
public function get($model, string $key, $value, array $attributes): float
{
// Transform the integer stored in the database into a float.
return round(floatval($value) / 100, precision: 2);
}
public function set($model, string $key, $value, array $attributes): float
{
// Transform the float into an integer for storage.
return round(floatval($value) * 100);
}
}
然后,在你的模型中使用该Cast,将其应用于指定的属性:
use App\Casts\JsonToArrCast;
use Illuminate\Database\Eloquent\Model;
class YourModel extends Model
{
protected $casts = [
'price' => MoneyCast::class,
];
}
现在,当从数据库中检索 price
时,它将自动转换为两位的数值。而在保存 price
到数据库时,它将自动转换为整型。
这样,你就可以在Laravel中使用 artisan make:cast
命令创建和使用类型转换器了。
使用场景:
- 数据库字段转换:如果你想要在将某个字段的值存储到数据库之前对其进行转换,或者从数据库检索后对其进行转换,你可以使用Cast来处理这些转换逻辑。
- 数据验证和处理:你可以在Cast中进行数据验证和处理,确保数据符合预期的格式和要求。
- 数据加工和修饰:Cast可以用来对从数据库中检索的值进行进一步的加工和修饰,以满足业务需求。
- 数据类型互转:如果需要将模型的属性从一种类型转换成另一种类型,例如将JSON字符串转换成数组或对象,可以使用Cast来实现。
本作品采用《CC 协议》,转载必须注明作者和本文链接