2013-02-09 4 views
0

У меня есть небольшая проблема в Qt. У меня есть две таблицы, одна с products, одна с categories. Я хочу показать список продуктов в QTableView. Ничего страшного. Также не сложно назначить отношение и отображаемое имя категории вместо id в одном столбце.QRelationalTable категория с отношением

Но, в categories У меня есть внутреннее отношение, поэтому я могу сделать подкатегории. Это сделано очень просто, создав дополнительный столбец с parentId.

И вот в чем проблема ... Как показать это отношение в QTableView? Я имею в виду, вместо отображения только названия категории, что продукты принадлежат, он будет отображать все родительские категории также, например, таким образом:

Есть 3 категории:

  • продуктов питания (без родителей)
  • Фрукты (с родительским Food)
  • Citrus (с родительскими фруктами)

продукт:

  • Оранжевый цвет относится к категории Цитрусовые.

В TableView в колонке Category она должна быть:

Продукты/Фрукты/Цитрусовый

или

Продовольственные> Fruits-> Цитрусовый

или что-то в этом роде ...

Как это сделать? Подкласс QRelationalTableModel и сделать дополнительное отношение? Или сделать делегата для этой колонки? Или, может быть, оба?

+0

Какие RDMS вы используете? Кроме того, ваша реализация heirachy может быть ловушкой эффективности - это метод «по умолчанию», есть лучшие способы. –

+0

В настоящее время я использую только SQLite, в будущем я планирую также расширить это приложение для использования MySQL. Каковы лучшие способы сделать это? И почему вы называете это «лучше»? – GwynBleidD

+0

Посмотрите на http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back?src=embed. Бит, который вам нужен, начинается с слайда 48. –

ответ

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; 

Теперь я могу получить строку всех родительских категорий с простым запросом, совместно я создал View

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.

Смежные вопросы