2013-11-27 25 views
0

我正在嘗試使用QT的QSql關係表模型。我是新的MySQL表關係,但仍然嘗試,並不能讓它在QT中正常工作。如何與QT QSqlRelationalTableModel中的mysql表關係?

我可以從MySQL得到結果:

create table stu(idd int auto_increment primary key,stu_name varchar(60),stu_age int); 


create table stuInfo(idd int auto_increment primary key,stu_city varchar(60),stu_sub varchar(100), foreign key(id) references stu(id)); 

select stu.stu_name,stuInfo.stu_city from stu inner join stuInfo on stu.id=stuInfo.id; 

從MySQL中檢索數據:

select stu.stu_name,stuInfo.stu_city from stu inner join stuInfo on stu.id=stuInfo.id; 

在QT,我不能使它發揮作用。我很困惑與setRelation()QSqlRelation()。我不完全理解不知道怎麼去執行在QT相同的查詢,我嘗試了各種方法,但有時我得到的空白數據,醜陋的頭,錯誤等

這裏是我的學習對碼:

model = new QSqlRelationalTableModel(); 
model->setTable("stu"); 

model->setRelation(0,QSqlRelation("stu","id","stu_name","stu_age")); 
model->setRelation(0,QSqlRelation("stuInfo","id","stu_city","stu_sub")); 
model->select(); 
ui->tableView->setModel(model); 

我需要幫助來解決我的代碼請!

+0

我寫了我的問題的更多細節,但stackoverflow給出了很多錯誤來解決。所以我也把它貼在pastebin上:http://pastebin.com/sX07Jknz。謝謝你幫助我! – user2715275

回答

1

A QSqlRelation用關係中的另一個字段的值替換字段的值,替換的字段不會再出現在查詢中,因此不能將2個關係分配給同一列,並且您不能將關聯分配給主鍵(如the documentation of setRelation中所述)。

基本上應該使用QSqlRelationalTableModel的結構是一個主表,它將有一個或多個外部索引字段,並且這些字段中的每一個都可以被外部表中所選字段的值替換索引來自(例如:用來自另一個以「city_id」爲主鍵的表的城市名稱替換主表中的「city_id」數字字段)。

對於你想要做的,你應該使用QSqlQueryModel與手動構建的查詢,而不是QSqlRelationalTableModel

1

問題是您的代碼並不真正表達您描述的模型。

您有一個名爲stuInfo的主表,它引用另一個名爲stu的表。 爲此Qt中,你應該創建一個基於「stuInfo」表(而不是「STU」!):

model=new QSqlRelationalTableModel(); 
    model->setTable("stuInfo"); 

然後你就可以實現你的外鍵,作爲一個關係:

model->setRelation(3,QSqlRelation("stu","id","stu_name")); 

您需要在stuInfo表上指向索引「3」,它是參考字段「id」的位置(0將指向主鍵,這不是您想要的!)。QsqlRelation的參數是參考表名稱(「stu」)主要字段名稱(「id」)和您想要指向的參考表字段:在這種情況下,我指向「stu_name」;如果我想指出的年齡,我可以做這樣的事情,而不是:

model->setRelation(3,QSqlRelation("stu","id","stu_age")); 

此代碼後:

model->select(); 
    ui->tableView->setModel(model); 

你應該有一個觀點,即顯示所有的stuInfo的領域,其最後一個字段(「id」)被映射到「stu」表上的名稱(或年齡);