"flatten" collection "With('model')"

"flatten" collection "With('model')"

一段时间以来,我一直在努力解决这个问题,在“https://laravel.com/docs/8.x/collections" 但似乎没有任何效果。

除了执行 foreach 并创建一个新数组(超级 sub-optimal);必须有更好的方法...对吗?

注意:我已经阅读了所有类似问题的答案,没有任何效果

这是我的查询:

$users = User::where('active',1)
    ->whereHas('role', function ($query) use ($column, $role){
            $query->where('role_'.$column, $role);
    })
    ->with('role:id,role_name,role_category')
    ->orderBy('users.id')
    ->get([
        'id',
        'email',
        'phone_number',
        'id_role',
        'firstname',
        'lastname',
        'verified',
        'active',
        'id_configuration',
        'external_service_id',
    ]);

我得到这个输出:

[{
    "id": 968,
    "email": "user@admin.com",
    "phone_number": "123",
    "id_role": 4,
    "firstname": "Name",
    "lastname": "TEST User",
    "verified": 0,
    "active": 1,
    "id_configuration": 1,
    "external_service_id": 123,
    "role": {
        "id": 4,
        "role_name": "Admin",
        "role_category": "Company"
    }
}]

但我需要 return 的输出是这样的:

[{

    "id": 968,
    "email": "user@admin.com",
    "phone_number": "12312",
    "id_role": 4,
    "firstname": "Admin",
    "lastname": "TEST User",
    "verified": 0,
    "active": 1,
    "id_configuration": 1,
    "external_service_id": 123,
    "role_name": "Admin",
    "role_category": "Company"
}]

您可以使用修改器将这些属性添加到模型中 https://laravel.com/docs/8.x/eloquent-mutators

假设每个用户只有一个角色,那么在User模型中添加

    public function getRoleNameAttribute($value)
    {
        return $this->role->role_name;
    }

如果此 属性 始终是必需的,那么您可以向用户模型添加附加 属性 https://laravel.com/docs/8.x/eloquent-serialization#appending-values-to-json

protected $appends = ['role_name'];

如果没有,那么返回模型时可以使用append https://laravel.com/docs/8.x/eloquent-serialization#appending-at-run-time

return $user->append('role_name')->toArray();