具有多个 WHERE 过滤器的 QtSql Dynamic Select 查询

QtSql Dynamic Select query with multiple WHERE filters


该方法应如下所示:

/**
 * @brief getData executes sql select query.
 * @param query [out] QSqlQuery query object after executing the query.
 * @param queryFilters [in] map of query filters (column-name, filter- 
   value).
 * @param table [in] table name.
 * @return 
 */
bool getData(QSqlQuery &query, std::map<std::string,QVariant> &queryFilters, 
std::string &table){
        bool status = false;
        std::string queryText = "SELECT * from " + table + " WHERE  ";
        // I should apply filters from queryFilters map here.
        return status;
} 

有几种方法可以做到这一点。

将 for 循环与 std::map 结合使用。

使用 for 循环遍历您的密钥对值。

bool getData(QSqlQuery &query, const std::map<std::string,QVariant> &queryFilters,
             std::string &table)
{
    // ...

    std::string queryText = "SELECT * from " + table + " WHERE";
    
    for (auto it = queryFilters.begin(); it != queryFilters.end(); )
    {
        queryText += " " + it->first + "='" + it->second.toString().toStdString() + "'";
    
        it++;
        // check the iterator isn't the last iterator
        if (it != queryFilters.end())
            queryText += " AND";    // separate your "filters" using an AND
    }

    // ...      
}

使用带有 QMap 的 for 循环。

但这就是 Qt,所以为什么不利用 QMap, QStringList, and QString QTL 类型。

bool getData(QSqlQuery &query, const QMap<QString, QVariant> &queryFilters,
             const QString &table)
{
    //  ...
    
    QString queryText = "SELECT * from " + table + " WHERE ";
    QStringList filters;
    foreach (const QString &filterKey, queryFilters.keys())
        filters << filterKey + "='" + queryFilters.value(filterKey).toString() + "'";
    
    queryText += filters.join(" AND ");
    
    //  ...
    
}

注意foreach是一个Qt定义的宏。参见 the foreach keyword

对于您可能想要了解的其他 QTL 类型,请参阅 containers


QSqlQueryModel???

从你的问题和评论中我无法判断你是否真的在后台使用了 sql table model/view/widget 或者你是否完全使用了其他东西。

I thought about using loop for this matter.But, I thought that there is a better way using some qt classes like : QSqlQueryModel

当然,只是浏览文档,QSqlQueryModel 没有过滤器功能。

但是...QSqlTableModel有没有这个功能。好的一面是,如果你已经有一个 QSqlQueryModel 坐在某处,你可以将它升级到 QSqlTableModel 因为后者继承了前者。但是还是那句话,我没有足够的信息来做出判断,所以我只是在黑暗中带领你。

希望这个答案能对您的困境有所启发,并提醒您如何提出更好的问题以获得更准确的答复。