eosio.cdt 中使用二级索引查询的例子
合约table 定义
struct [[eosio::table("members"), eosio::contract("shadow.zion")]] member_table{
uint64_t id;
capi_name username;
uint64_t group_id;
uint64_t primary_key() const { return id; }
uint64_t get_sub_key() const { return username; }
uint64_t get_third_key() const { return group_id; }
};
table 创建
typedef eosio::multi_index<"members"_n, member_table, eosio::indexed_by<"bysubkey"_n, eosio::const_mem_fun<member_table, uint64_t, &member_table::get_sub_key>>, eosio::indexed_by<"bythirdkey"_n, eosio::const_mem_fun<member_table, uint64_t, &member_table::get_third_key>>> member_tables;
table 使用
member_tables member_table( _self, _self.value);
auto third_index = member_table.get_index<"bythirdkey"_n>();
auto member_itr = third_index.find( group_id );
eosio_assert( member_itr != third_index.end(), "121" );
while(member_itr != third_index.end()){
if(member_itr->username == account && member_itr->group_id == group_id){
break;
}
member_itr++;
}
//增,改
if(member_itr == third_index.end()){
member_table.emplace( _self, [&]( auto& m ) {
m.id = member_table.available_primary_key();
m.username = other_account;
m.group_id = group_id;
m.group_weight = group_weight;
});
}
else{
third_index.modify( member_itr, _self, [&]( auto& m ) {
m.group_weight = member_itr->group_weight + group_weight;
});
}