修剪 Laravel 中所有 Eloquent 模型的所有字符串属性

Posted

技术标签:

【中文标题】修剪 Laravel 中所有 Eloquent 模型的所有字符串属性【英文标题】:Trim all string properties of all Eloquent models in Laravel 【发布时间】:2021-12-31 23:47:19 【问题描述】:

我使用 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 中实现这一点?

谢谢

【问题讨论】:

如何从数据库中获取数据?在查询中使用trim() 谢谢@brombeer。不幸的是,我使用默认的 Eloquent 方法进行查询。像这样:MyModel::where('property1', 'valuetoMatch')->first(); 我不使用“自定义 SQL 查询”。 (这不是一个真正的选择,因为我希望 Eloquent “自动发现”我表的所有列) 【参考方案1】:

特定于模型,您可以覆盖 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)
        );
      

如果您想将此应用到所有模型,您可以使用抽象类扩展 Model,在那里覆盖 hydrate 并将其用作您的基本模型。

这是有效的,因为Illuminate\Database\Eloquent\Builder 在从数据库中检索到的列上调用了该方法。 如果您使用的是旧 php 版本,请记住删除方法返回签名。

【讨论】:

比编写大量访问器来修剪遗留表上的属性要好得多。

以上是关于修剪 Laravel 中所有 Eloquent 模型的所有字符串属性的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 嵌套关系枢轴与约束

使用 eloquent 截断 laravel 中的所有表

在 Laravel Eloquent 中使用关系表中的特定列获取表中的特定列

Laravel Eloquent 所有与关系

从Laravel和Eloquent的桌子中选择所有

使用 eloquent laravel 检索所有数据