Trim Laravel 中所有 Eloquent 个模型的所有字符串属性
Trim all string properties of all Eloquent models in Laravel
我使用 Laravel(+Eloquent 模型)连接到遗留数据库。
我的模型的字符串属性充满了空白。 (由于数据库内部的数据)
当前输出(为了便于阅读,JSON)如下所示:
{
"THIRDNAME": "Company ",
"THIRDNAME2": "",
"THIRDADDR": "Street Of Company 117/1 ",
"THIRDADDR2": "",
"THIRDZIP": "1740 ",
"THIRDCITY": "TERNAT "
}
我无法更改该数据库(使用它的其他遗留工具),但我想在查询数据库时更改这些属性。 (使用 Eloquent 模型)
得到这样的东西:
{
"THIRDNAME": "Company",
"THIRDNAME2": "",
"THIRDADDR": "Street Of Company 117/1",
"THIRDADDR2": "",
"THIRDZIP": "1740",
"THIRDCITY": "TERNAT"
}
Laravel 文档提到 "Mutators & Casting" 但它需要提供特定的字段来进行转换。
我想将自定义“cast”或“mutator”(基本 TRIM 操作)应用于 所有模型的 所有字符串属性 .
您将如何在 Laravel 中实现这一目标?
谢谢
模型特定,您可以覆盖 hydrate() 方法:
class MyModel extends Model
{
use HasFactory;
protected $fillable = [
// ... //
];
public function hydrate(array $objects): Collection
{
return parent::hydrate(
array_map(function ($object) {
foreach ($object as $k => $v) {
if (is_string($v)) {
$object->$k = trim($v);
}
}
return $object;
}, $objects)
);
}
}
如果您想将此应用到您的所有模型,您可以使用抽象 class 扩展模型,覆盖那里的 hydrate 并将其作为您的基础模型。
这是有效的,因为 Illuminate\Database\Eloquent\Builder
在从数据库中检索到的列上调用该方法。
如果您使用的是旧 PHP 版本,请记住删除方法 return 签名。
我使用 Laravel(+Eloquent 模型)连接到遗留数据库。
我的模型的字符串属性充满了空白。 (由于数据库内部的数据)
当前输出(为了便于阅读,JSON)如下所示:
{
"THIRDNAME": "Company ",
"THIRDNAME2": "",
"THIRDADDR": "Street Of Company 117/1 ",
"THIRDADDR2": "",
"THIRDZIP": "1740 ",
"THIRDCITY": "TERNAT "
}
我无法更改该数据库(使用它的其他遗留工具),但我想在查询数据库时更改这些属性。 (使用 Eloquent 模型)
得到这样的东西:
{
"THIRDNAME": "Company",
"THIRDNAME2": "",
"THIRDADDR": "Street Of Company 117/1",
"THIRDADDR2": "",
"THIRDZIP": "1740",
"THIRDCITY": "TERNAT"
}
Laravel 文档提到 "Mutators & Casting" 但它需要提供特定的字段来进行转换。
我想将自定义“cast”或“mutator”(基本 TRIM 操作)应用于 所有模型的 所有字符串属性 .
您将如何在 Laravel 中实现这一目标?
谢谢
模型特定,您可以覆盖 hydrate() 方法:
class MyModel extends Model
{
use HasFactory;
protected $fillable = [
// ... //
];
public function hydrate(array $objects): Collection
{
return parent::hydrate(
array_map(function ($object) {
foreach ($object as $k => $v) {
if (is_string($v)) {
$object->$k = trim($v);
}
}
return $object;
}, $objects)
);
}
}
如果您想将此应用到您的所有模型,您可以使用抽象 class 扩展模型,覆盖那里的 hydrate 并将其作为您的基础模型。
这是有效的,因为 Illuminate\Database\Eloquent\Builder
在从数据库中检索到的列上调用该方法。
如果您使用的是旧 PHP 版本,请记住删除方法 return 签名。