我需要映射到相应数据表的模型,每次更新模型/表时,我都需要将更改映射到存档表以供历史引用。例如 -
public function dropzone(Request $request)
{
$img = $request->file('file'); //access dropzone files
}
因此,每次修改表A时,我都需要向A_History添加一个条目,其中包含新数据或原始数据的精确副本。有没有通用的方法来做到这一点,这样我可以将一个字符串作为模型名称传递给方法或类,并且该方法可以自动循环遍历Model类的所有属性,并将它们映射到另一个类是通过匹配名称添加?
答案 0 :(得分:0)
下面使用反射,所以要小心性能。如果性能是一个非常重要的方面,那么实际上逐个映射属性可能会更好,但如果您正在查看通用实现,则可以尝试以下代码段。
// object instances
A sourceInstance = new A();
A_History destInstance = new A_History();
MapSourceValuesToDestination(sourceInstance, destInstance);
private void MapSourceValuesToDestination(object sourceObject, object destinationObject)
{
//get all properties
PropertyInfo[] sourceProperties = typeof (sourceObject).GetProperties();
PropertyInfo[] destinationProperties = typeof (destinationObject).GetProperties();
// foreach in source
foreach (PropertyInfo property in sourceProperties)
{
if (property != null)
{
string propertyName = property.Name;
if (!string.IsNullOrEmpty(propertyName))
{
// get destination property matched by name
PropertyInfo matchingProperty = destinationProperties.FirstOrDefault(x => x.Name.Equals(propertyName, StringComparison.InvariantCultureIgnoreCase));
if (matchingProperty != null)
{
// get source value
object sourceValue = property.GetValue(sourceInstance);
if (sourceValue != null)
{
// set source value to destination
matchingProperty.SetValue(destInstance, sourceValue);
}
}
}
}
}
}
答案 1 :(得分:0)
如果您的历史模型与保存历史记录的模型具有相同的属性,那么您可以执行类似的操作。
添加Newtonsoft.Json
nuget包并执行。
添加下面显示的代码。
A model = new A();
//.....
// add data to the model
var json = JsonConvert.SerializeObject(model);
A_History historyModel = JsonConvert.DeserializeObject<A_History>(json);
现在,您的历史记录模型将填充与A模型相同的所有属性。