[英]How to (re)organize this data - Lumen/Laravel
到目前為止,我的基於 Lumen 的后端 API 從我的 MariaDB 中獲取了以下結果:
[{
"Internal_key": "TESTKEY_1",
"extensiontable_itc": {
"description": "EXTENSION_iTC_1"
},
"extensiontable_sysops": {
"description": "EXTENSION_SYSOPS_1"
}
}, {
"Internal_key": "TESTKEY_2",
"extensiontable_itc": {
"description": "EXTENSION_ITC_2"
},
"extensiontable_sysops": {
"description": "EXTENSION_SYSOPS_2"
}
}, {
"Internal_key": "TESTKEY_3",
"extensiontable_itc": {
"description": "EXTENSION_ITC_3"
},
"extensiontable_sysops": {
"description": "EXTENSION_SYSOPS_3"
}
}, {
"Internal_key": "TESTKEY_4",
"extensiontable_itc": {
"description": "EXTENSION_ITC_4"
},
"extensiontable_sysops": {
"description": "EXTENSION_SYSOPS_4"
}
}, {
"Internal_key": "TESTKEY_5",
"extensiontable_itc": {
"description": "EXTENSION_ITC_5"
},
"extensiontable_sysops": {
"description": "EXTENSION_SYSOPS_5"
}
}]
您看到的是從 3 個表中獲取的數據,一個 Coretable 和兩個擴展表。 coretable 包含“Internal_Key”,它通過它的 id 被擴展表引用,我聲明它隱藏在模型中,因此它當前沒有顯示在 fetchresults 中。 執行此提取的代碼行如下所示:
$join = coretable::with($permittedTables)->get();
$permittedTables
是一個表名數組,因此基本上任何數量和組合的擴展表都可以與核心表中的引用記錄一起提取。
數據最終應插入到類似列表的視圖中。 此處,對於每個“Internal_key”,應創建一行,其中將插入與該鍵關聯的所有數據。
我對數據的當前結構非常滿意,因為我可以隨意遍歷它,從而根據列表的需要提取數據。 但是,我想知道是否有任何方法可以(重新)以不同的方式組織它。 如果我想將擴展表中的每組數據放在與其各自 Internal_key 相同的“arraylevel”上,我應該怎么做? 我應該改變獲取數據的方式,還是應該在獲取后重新排列數據? 在這兩種情況下:最簡單、最可靠的方法是什么?
編輯:有關我的數據庫結構的更多信息。 Coretable 有一個 ID 作為主鍵,它通過“coretable_id”FK 在擴展表中引用。 這是我的數據庫的外鍵架構:
+------------------------------------+-----------------------------+--------------------------------------+--------------------------+------------------------+
| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+------------------------------------+-----------------------------+--------------------------------------+--------------------------+------------------------+
| ad_usersxad_groups | Ad_user_id | fk_ad_groupxad_user | ad_users | id |
| ad_usersxad_groups | Ad_group_id | fk_ad_userxad_group | ad_groups | id |
| extensiontables_registryxad_groups | ad_group_id | fk_ad_groupxextensiontables_registry | ad_groups | id |
| extensiontables_registryxad_groups | extensiontables_registry_id | fk_extensiontables_registryxad_group | extensiontables_registry | id |
| extensiontable_itc | coretable_id | fk_extensiontable_itc_coretable | coretable | id |
| extensiontable_sysops | coretable_id | fk_extensiontable_sysops_coretable | coretable | id |
| inaccessibletable | coretable_id | fk_inaccessibletable_coretable | coretable | id |
+------------------------------------+-----------------------------+--------------------------------------+--------------------------+------------------------+
首先:我們沒有關於 coretable 和 extensiontables 模型的信息,所以我們不知道你是否已經實現了多態關系,這可能完全適合你的范圍。
也就是說,可能的重組是將樹展平為一組對象,其中
"desc_itc" : "EXTENSION_iTC_1"
那會給你留下這樣的東西:
[{
"Internal_key": "TESTKEY_1",
"desc_itc": "EXTENSION_iTC_1",
"desc_sysops": "EXTENSION_SYSOPS_1"
}
}, ...
]
編輯:您在您的評論中提到,有一個人跟每一個外鍵只存在於extensiontable,並引用一個關系coretable.id
用鑰匙coretable_id
。
組織這次數據的另一種方法是將兩列添加到coretable
, extendable_type
Ë extendable_id
並實施一對一多態的關系:在存儲的型號名extendable_type
通過僅僅訪問柱會讓你調用所有擴展extendable
你的雄辯的財產模型,例如
$extendable = $core->extendable;
為了實現這一點,您只需要在coretable
模型中定義以下方法:
/**
* Returns the matching extension data
*/
public function extendable() {
return $this->morphTo();
}
這對於每個extensiontable_*
模型:
/**
* Returns the matching core data
*/
public function coretable() {
return $this->morphOne('App\coretable', 'extendable');
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.