在 Laravel 个模型中搜索包含 'name' 的键

Search Laravel Models for keys containing 'name'

我在我的项目中使用 Laravel 审计,我需要能够在视图中显示模型 'name' 字段。我得到这样的模型

        $audit = \OwenIt\Auditing\Models\Audit::find($id);
        $type = $audit->auditable_type;
        $model = $type::where('id',$audit->auditable_id)->get();

我可以像这样遍历所选模型

                    foreach ($model[0] as $key => $val) {
                        if (str_contains($key,'name')) {
                            $mname = $key;
                            $mval = $val;
                        }
                    }

模型有各种标识名称的键,例如:用户模型有 'name',组织模型有 organisation_name

我想从包含字符串 'name' 的每个模型中获取第一个键和值,但是使用上面的方法或 strpos 会抛出一个错误,指出 $mname 未定义。我哪里错了?

所以我不完全确定你想要什么,但这可能有效

$models = $type::where('id',$audit->auditable_id)->get();

$modelsWithName = $models->map(function($model) {
    foreach($model->getAttributes() as $attribute) {
        if (str_contains($attribute, 'name')) {
            $model->mname = $attribute;
            return $model;
        }
        return null;
    }
})->filter(function($model) {
    return $model !== null;
});

首先我们映射你的模型,我们向它添加一个名为 mname 的属性并将其设置为正确的属性,然后我们 return 模型,如果没有名称属性我们 return null,然后我们过滤掉空值,这样我们最终得到一组带有 mname 属性集的模型。

此外,如果您有 2 个名字,这将不起作用。例如first_name 和 last_name

不过,我个人只会为您的模型添加属性.. https://laravel.com/docs/9.x/eloquent-mutators

你也可以用first()代替get(), 无需使用 $model[0]

  foreach ($model as $key => $val) {
                    if (str_contains($key,'name')) {
                        $mname = $key;
                        $mval = $val;
                    }
                }

破解成数组

        $model = $type::where('id', $audit->auditable_id)->first()->toArray();
        foreach ($model as $key => $val) {
            if (str_contains($key, 'name')) {
                $mname = $key;
                $mval = $val;
            }
        }