具有关系的QRelationalTable类别

时间:2013-02-09 14:55:58

标签: c++ sql qt

我在Qt中遇到小问题。我有两个表,一个有products,一个有categories。我想在QTableView中显示产品列表。没什么大不了。在一列中分配关系和显示类别而不是id的名称也没什么大不了的。

但是,在categories我有内部关系,所以我可以创建子类别。通过使用parentId创建其他列,可以非常简单。

这就是问题......如何在QTableView中显示这种关系?我的意思是,它不会只显示产品所属类别的名称,而是显示所有父类别,例如:

有3个类别:

  • 食物(没有父母)
  • 水果(含有母食)
  • 柑橘(含有亲子水果)

产品:

  • Orange分配到Citrus类别。

TableView列的Category中,它应该是:

  

食品/水果/柑橘

  

罐头 - > Fruits->柑橘

或类似的......

怎么做?子类QRelationalTableModel并建立其他关系?或者为该列制作代表?或者两者兼而有之?

1 个答案:

答案 0 :(得分:0)

Arleady做到了......

我做了什么: 对于表categories

CREATE TABLE categories (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(100), parent NUMERIC)

创建了表categories_closure(所有SQL语句都是针对SQLite的):

CREATE TABLE categories_closure (parent NUMERIC, child NUMERIC, depth NUMERIC)

接下来,创建了一些触发器来自动化我的闭包表

CREATE TRIGGER categories_delete AFTER DELETE ON categories
BEGIN
    DELETE FROM categories_closure WHERE child=OLD.id;
    UPDATE categories SET parent=OLD.parent WHERE parent=OLD.id;
END;

CREATE TRIGGER categories_insert AFTER INSERT ON categories
BEGIN
    INSERT INTO categories_closure (parent, child, depth) VALUES (NEW.id, NEW.id, 0);
    INSERT INTO categories_closure (parent, child, depth)
        SELECT p.parent, c.child, p.depth+c.depth+1
            FROM categories_closure p, categories_closure c
            WHERE p.child=NEW.parent AND c.parent=NEW.id;
END;

CREATE TRIGGER categories_update AFTER UPDATE OF id,parent ON categories
BEGIN
    DELETE FROM categories_closure WHERE child=OLD.id;
    INSERT INTO categories_closure (parent, child, depth) VALUES (NEW.id, NEW.id, 0);
    INSERT INTO categories_closure (parent, child, depth)
        SELECT p.parent, c.child, p.depth+c.depth+1
        FROM categories_closure p, categories_closure c
        WHERE p.child=NEW.parent AND c.parent=NEW.id;
    UPDATE categories SET parent=NEW.id WHERE parent=OLD.id;
END;

现在我可以使用简单查询获取所有父类别的字符串,我创建了一个视图

CREATE VIEW categories_resolved AS
SELECT
    id,
    group_concat(name, ' ') AS fullname,
    group_concat(parent) AS branch
FROM (
    SELECT
        c.id,
        cc.parent,
        c2.name
    FROM categories c
    LEFT JOIN categories_closure cc ON c.id=cc.child
    LEFT JOIN categories c2 ON c2.id=cc.parent
    ORDER BY cc.depth DESC
)
GROUP BY id
ORDER BY id ASC

最后我在QSqlRelationalTableModel而不是categories表中使用了此关系视图。简单,无需创建模型,视图,代理,委托或修改Qt类的代码。