Solidity
契約中的一對多關係
If
id
(Eg:1) 結構中的欄位不是唯一的,並且不同的名稱映射到相同的id=1
.id=1
可以從區塊鏈中獲取所有映射的名稱嗎?pragma solidity ^0.4.4; contract Register{ struct Details{ bytes id; string name; } mapping (bytes => Details) DetailsTable; function saveBondToBC(bytes id,string name) payable returns(bool success){ DetailsTable[id].id = id; DetailsTable[id].name = name; return true; } function getAllNames(bytes id) return (string){ DetailsTable[id].name; //Return latest 'name' written }
謝謝,這個對我有用:)
struct IdStruct{ bytes12[] structArray; } mapping(string => IdStruct) idStructs; function appendNames(string id, bytes12 name) payable returns (bool success){ idStructs[id].structArray.push(name); } function getName(string id) returns(bytes12[]){ return idStructs[id].structArray; }
映射是唯一的(或關係數據庫術語中的多對一關係)。例如,如果 id 123 映射到名稱 Vitalik。Id 123 只能導致 Vitalik 而沒有其他價值!然而,其他 id(例如 947)也可以指向 Vitalik(多對一關係)。
例如,如果您將映射更新
123 => Vitalik
為123 => Gavin
,那麼很明顯 id 123 將僅指向 Gavin 和 Gavin。我不確定這是否明顯,但為了清楚起見,在這些行中
DetailsTable[id].id = id; DetailsTable[id].name = name;
您根本不會更新映射,而只會更新結構中的欄位。此外,如果您的 id 是兩個不同的值,我會找到更好的名稱。如果您在結構中的 id 與映射的 id 相同,則沒有必要再次將 id 儲存在結構中(這會產生冗餘,並且只會增加保持兩個值同步的成本)。
如果您不跟踪您的 id(在您的智能合約中或數據庫中的非區塊鏈中),您也不能循環映射既不知道哪些 id 已被初始化(所有映射都是有效的)
在您的智能合約中,您可以為此創建一個數組
bytes[] allMyUniqueIds;
然後循環
allMyUniqueIds
將返回你所有的Details
結構