setRelation

setRelation это первое ради чего мы делали развитие библиотеки Qt.

В классе QpSqlTableModel функция setRelation устанавливает связь нашей таблицы (назовем ее таблица 1) с другой таблицей (будем называть ее таблица 2) и делает замену id поля из таблицы 1 на удобочитаемое представление, например на  содержание текстового поля из таблицы 2.

Но наш вариант setRelation (класс QpSqlTableModel) делает это по другому.

Наш setRelation заставляет selectStatement добавлять к запросу кроме самого текста замены ещё скрытое поле самого id связи, что впоследствии очень удобно использовать.

Таким образом у нас поле id связи теперь  всегда присутствует в строке таблицы 1. Конечно мы его логично скрываем от пользователя ибо зачем ему видеть мало-чего говорящую колонку с какими-то цифровыми значениями. Пользователь видит понятную текстовую замену.

фотка 1

Теперь зачем это было нужно. Ну например копируем мы строку. Поле текстовой замены бессмысленно копировать, так как в это поле надо устанавливать значение id связи (число). Но это число у нас под рукой в служебном дополнительном поле. Таким образом нам не надо делать отдельный запрос к базе, чтобы вытащить это значение.

Другой пример: допустим видим мы в таблице 1 строку, где есть тестовая замена из другой таблицы и хотим мы открыть строку таблицы 2 в диалоговом окне для редактирования например. И тут нам надо знать id связи, а он у нас всегда под рукой.Просто берём открывает таблицу 2 и передаём ей этот id. То есть не надо опять же делать отдельный запрос к базе для получения этого значения id.

Ещё один пример - допустим сделали вставку строки (все поля ещё пустые). Установили в поле relation связи текстовую замену. Далее надо сохранить строку. При сохранении строки полю связи надо установить значение id связи, а где его взять? Правильно из дополнительного сервисного поля.

Смотрите наш вариант QpSqlTableModel.