我有两个表users
和users_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;
}
答案 0 :(得分:0)
您可以在收集级别使用module = {}
exec(test, module)
assert module['foo'](3) == 9
方法吗?
例如,您有来自网址的module
数组。在这种情况下,它只是一个元数据字段。
only()
然后得到所有用户:
fields
或者您希望获得用户集合。
然后使用$fields = ['username'];
方法将结果过滤到您需要的字段:
$users_all = User::all();
然后返回过滤后的集合:
only()