交叉引用数组元素命名索引-PHP/Laravel/Lumen
TL;博士: 我想使用userinput创建的任意大小的一维数组中的数据,并将其值填充到通过数据库查询创建的任意大小的二维数组的相应字段中 我有一个Web应用程序,用户可以在读模式和写模式下访问DBs数据。 他可以访问的数据库记录由他所属的部门确定。 记录以数据库结构组织,其中核心表包含所有部门都可见的数据,而通过FK引用核心表的扩展表包含的数据仅对属于与此扩展表关联的部门的用户可见 我正在使用Lumen/Laravel及其雄辩的模型从后端与DB交互,访问DB的一些示例代码如下所示:交叉引用数组元素命名索引-PHP/Laravel/Lumen,php,laravel,eloquent,orm,lumen,Php,Laravel,Eloquent,Orm,Lumen,TL;博士: 我想使用userinput创建的任意大小的一维数组中的数据,并将其值填充到通过数据库查询创建的任意大小的二维数组的相应字段中 我有一个Web应用程序,用户可以在读模式和写模式下访问DBs数据。 他可以访问的数据库记录由他所属的部门确定。 记录以数据库结构组织,其中核心表包含所有部门都可见的数据,而通过FK引用核心表的扩展表包含的数据仅对属于与此扩展表关联的部门的用户可见 我正在使用Lumen/Laravel及其雄辩的模型从后端与DB交互,访问DB的一些示例代码如下所示: $join
$join = coretable::with($permittedTables)->find(1);
这里,$permittedTables
是一个表名数组,引用用户可访问的扩展表
然后,上述代码获取以下结果:
{
"id": 1,
"Internal_key": "TESTKEY_1",
"extensiontable_itc": {
"description": "EXTENSION_iTC_1"
},
"extensiontable_sysops": {
"description": "EXTENSION_SYSOPS_1"
}
}
现在,用户将在前端有一个类似列表的视图,其中所有这些数据都已合并到一个大表中。在此列表中,用户可以单击一个字段并更改其值,然后发送http请求将这些更改持久化到数据库。
此http请求将是一个JSON格式的数组,我将在后端使用JSON\u decode()
,并使用传输的id
获取模型,如上所示
现在,在这一点上,以关联数组结构组织的两组数据将面对面。来自http请求的输入很可能是一维数组,而来自DB的模型几乎肯定是您在上面看到的多维数组。
此外,存在大量可能的数据集组合。它可以是上面看到的组合,但也可以是来自此处未列出的其他表的数据组合,也可以是聚合到模型和userinput中的一组较大或较小的表。
因此,将传入输入设置到DB的过程必须能够动态地确定输入的哪个字段必须放在DB的哪个字段中
这是我第一次这么做,但我没有很多办法。我想到的唯一一件事是将DB列名镜像到输入数组的索引,然后在模型中循环,并将其索引与当前选择的输入元素的索引进行比较。如果匹配,则输入的各个字段的值将设置为DB的各个字段。
我知道,为了使其工作,受此过程影响的表的每一列在整个数据库中都必须具有唯一的名称。但这是可行的。
不过,这是目前我唯一能想到的想法
但是,我想问你两件事:
1) 有没有其他不太“黑客”的方法来解决上述问题?
2) 有人能给我一个自定义函数/一组自定义函数,能够在比较索引时迭代两个数组,其中至少一个是多维的,然后在索引匹配时将值从数组a
设置为数组B
下面我有一个小代码示例,创建了两个数组,它们再现了所描述的情况,您可以使用它们进行处理:
首先,输入端:
$inputArray = array(
"id" => 1,
"internal_key" => "TESTKEY_1",
"CPU" => "intelTest1",
"GPU" => "nvidiaTest1",
"Soundcard" => "AsusTest1"
"MAC" => "macTest1",
"IP" => "ipTest1",
"VLAN" => "vlanTest1"
);
然后,DB侧:
$modelArray = array(
"id" => 1,
"internal_key" => "TESTKEY_2",
"extensiontable_itc" => array (
"CPU" => "intelTest1",
"GPU" => "nvidiaTest2",
"Soundcard" => "AsusTest1"
),
"extensiontable_sysops" => array (
"MAC" => "macTest2",
"IP" => "ipTest1",
"VLAN" => "vlanTest1"
)
);
我建议减少你的问题,或者至少增加一个TL;正如我想象的那样,很多人会看到这篇文章的长度,而不想通读它。@Rwd补充道;博士,希望有帮助!:)