crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Снова о QSqlRelationalTableModel, А если нужно взять несколько столбцов из другой таблицы?
mva
  опции профиля:
сообщение 26.6.2009, 15:46
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Все примеры использования QSqlRelationalTableModel сделаны для демонстрации работы с одним столбцом из другой таблицы. Как быть, если мне нужно взять несколько столбцов из другой таблицы?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 26.6.2009, 15:57
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Я активно не работал с этим классом и отказался от него из-за того, что он не отображает строки, где не находится "отношение" - ключ ссылается на данные, которых нет. Мне для задачи надо было перевязывать ключи динамически, отвязывать когда не нужны. А если не показывается строка, которую можно "перевязать", то и работать с этим классом нельзя.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.6.2009, 16:51
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


mva, а что именно тебе не понятно?
У меня в одной из таблиц несколько столбцов, и вопросов даже не возникло.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 26.6.2009, 17:19
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Возьмем этот пример

В нем таблица city имеет 2 поля: id и name.
А если, предположим, эта таблица имеет еще поля? Ну, например, почтовый индекс и междугородный телефонный код (поля таблицы city: id, name, post_index, phone_code) и мне их нужно отобразить?

Как строить реляции? Как в таком случае писать?

model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));
model->setRelation(2, QSqlRelation("city", "id", "post_index"));
model->setRelation(2, QSqlRelation("city", "id", "phone_code"));

Так что ли?

Это что, все эти значения (name, post_index, phone_code) запишутся во второй столбец? Или я чего-то не понимаю?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 26.6.2009, 17:36
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Я чего-то не понимаю. В отношении всегда 2 объекта:
- объект, который ссылается
- объект на который ссылаются

Если есть Петя, в поле "адрес" у которого ключ 1. В другой таблице по ключу 1 стоит "Мухосранск, 10, кв.20".
Ключ "1" не может ссылаться сразу на 2 и более объекта. Например "номер пасспорта", "телефонный номер" и "приводы в милицию".

Вернее, теоретически может. Но обычно все PRIMARY ключи - автоинкрементируемые. Если только в одну из перечисленных полей добавится запись, то ключи перестанут совпадать. Это должна быть какая-то синхронность редактирования БД чтоль.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 26.6.2009, 17:48
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Есть конечно вариант использовать не таблицу employee, а ее просмотр, в котором для каждого поля внешней таблицы city сделать свой ключ - копию ключа city. Например так:

CREATE VIEW vw_employee AS
SELECT ID, Name, City AS city_name, City AS city_post_index, City AS city_phone_code , Country
FROM employee


А потом в приложении написать:

model->setTable("vw_employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));
model->setRelation(3, QSqlRelation("city", "id", "post_index"));
model->setRelation(4, QSqlRelation("city", "id", "phone_code"));

Этот вариант прокатит, но не хотелось бы использовать такие "костыли" - некрасиво. И возможность редактирования таблицы employee здесь теряется...



Цитата(SABROG @ 26.6.2009, 18:36) *
Я чего-то не понимаю. В отношении всегда 2 объекта:
- объект, который ссылается
- объект на который ссылаются

Если есть Петя, в поле "адрес" у которого ключ 1. В другой таблице по ключу 1 стоит "Мухосранск, 10, кв.20".
Ключ "1" не может ссылаться сразу на 2 и более объекта. Например "номер пасспорта", "телефонный номер" и "приводы в милицию".

Вернее, теоретически может. Но обычно все PRIMARY ключи - автоинкрементируемые. Если только в одну из перечисленных полей добавится запись, то ключи перестанут совпадать. Это должна быть какая-то синхронность редактирования БД чтоль.


Все правильно, в отношении "один-к-одному" всегда 2 объекта. Но, у каждого из этих объектов может быть несколько атрибутов. Например, у Пети может быть задан день рождения и место рождения, а может еще что-то. Так вот, у проживающего по адресу "Мухосранск, 10, кв.20" я хочу знать ФИО, дату рождения и где он родился. Или мне для каждого атрибута отдельную таблицу заводить? Отдельно таблицу для дат рождения с двумя полями, отдельно таблицу мест рождений тоже с двумя полями. Так что ли?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.6.2009, 17:55
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(mva @ 26.6.2009, 21:19) *
Это что, все эти значения (name, post_index, phone_code) запишутся во второй столбец? Или я чего-то не понимаю?
не угадал, в третий, т.к. используется не номер, а индекс столбца.

Цитата(mva @ 26.6.2009, 21:19) *
у, например, почтовый индекс и междугородный телефонный код (поля таблицы city: id, name, post_index, phone_code) и мне их нужно отобразить?

Вот и запиши на бумажке:
create table city{
id,                  /* idx=0 */
name,            /* idx=1 */
post_index,    /*  idx=2 */
phone_code   /*  idx=3 */
}


И код:
model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));

А теперь расшифруй запись во втрой строке и связь с таблицей employee
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 26.6.2009, 17:55
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 26.6.2009, 18:51) *
Цитата(mva @ 26.6.2009, 21:19) *
Это что, все эти значения (name, post_index, phone_code) запишутся во второй столбец? Или я чего-то не понимаю?
не угадал, в третий, т.к. используется не номер, а индекс столбца.


Я имею ввиду конечно индекс и нумерацию с 0. В примере написано "2", значит "второй", стоял бы "0" - тогда был бы "нулевой".

Но это не суть...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.6.2009, 18:04
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


mva, по сути ты не понял, что есть реляционная (относительная) связь в БД. Это место для себя прояснишь, отпадёт вопрос с Qt.

Цитата(mva @ 26.6.2009, 21:19) *
Возьмем этот пример
этот пример акуратно имеет два столбца с реляционными связями
City и Country
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 26.6.2009, 18:06
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Кажется я понял о чем ты. Если есть таблицы:

User:
id, name, country_key, city_key, address_key

country:

id, name, GPS

city:

id, name, population, GMT

address:

id, street, room, phone


То вместо:

Вася, Россия, Мухосранск, ул. Ленина, 25

ты хочешь получать:

Вася, Россия,[GPS], Мухосранск, [pupulation], [GTM], ул. Ленина, 25, [room], [phone]

Так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 21.12.2024, 19:13