如何动态更改控制器中的Model属性?

时间:2017-11-16 19:40:20

标签: php laravel laravel-5.5

我有两个表usersusers_metadata,其中包含一个用户hasMany元数据。

当我提取所有用户时,我希望能够选择某些字段,其中一些字段存在于元数据表中。

users - id:1
users_metadata - user_id:1, key:username, value: MyUsername
users_metadata - user_id:1, key:birthday, value: 2017-11-16

通过网址,我可以添加一个字段属性,列出我想要选择的字段而不是所有字段。

/api/v1/users?fields=username

我希望能够做的是,而不是获取所有元数据只是获取字段中列出的元数据。

// Are we selecting all the fields?
if(!is_array($fields))
{
    // We are not, so lets build an array
    $fields = explode(',', $fields);

    // Loop through the users
    foreach($users as $user)
    {
        // Loop through the fields
        foreach($fields as $field)
        {
            // Try to fetch it as metadata
            if(array_key_exists($field, $user->metadata->toArray()))
            {
                $metadata[] = $field;
            }
        }

        // Adjust the user metadata
        $user->metadata = $user->metadata->filter(function($value, $key) use($metadata)
        {
            return in_array($key, $metadata);
        });
    }
}

然而,这并没有使用新元数据更新我的数据,当我转储用户数据时,我仍然得到所有原始元数据而不仅仅是用户名。

/**
 * Fetch all the metadata for a user.
 *
 * @return objects
 */
public function metadata()
{
    return $this->hasMany(UserMetadata::class);
}

    /**
     * Fetch the metadata as an attribute.
     *
     * @return array
     */
    public function getMetadataAttribute()
    {
        return $this->metadata()->get()->flatMap(function($values)
        {
            return [$values['key'] => $values['value']];
        });
    }

    /**
     * Update the metadata attribute.
     *
     * @param varied $value     The new metadata attribute.
     * @return void
     */
    public function setMetadataAttribute($value)
    {
        $this->attributes['metadata'] = $value;
    }

1 个答案:

答案 0 :(得分:0)

您可以在收集级别使用module = {} exec(test, module) assert module['foo'](3) == 9 方法吗?

例如,您有来自网址的module数组。在这种情况下,它只是一个元数据字段。

only()

然后得到所有用户:

fields或者您希望获得用户集合。

然后使用$fields = ['username']; 方法将结果过滤到您需要的字段:

$users_all = User::all();

然后返回过滤后的集合:

only()

来自:https://laravel.com/docs/5.5/collections#method-only