如何在QT QSqlRelationalTableModel中与mysql表关系?

时间:2013-11-27 16:13:27

标签: c++ mysql sql qt

我正在尝试使用QT QSqlRelationalTableModel。我是MySQL表关系的新手,但我仍然尝试过,无法在QT中正常工作。

我可以从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);

2 个答案:

答案 0 :(得分:1)

QSqlRelation将字段的值替换为关系中其他字段的值,替换的字段将不再出现在查询中,因此您不能将2个关系分配给该字段列,您无法为主键指定关系(如the documentation of setRelation中所述)。

基本上应该使用QSqlRelationalTableModel的结构将是一个主表,它将具有一个或多个外部索引字段,并且这些字段中的每一个都可以替换为表中所选字段的值。外部索引来自哪个(例如:用主要表中的“city_id”数字字段替换来自另一个表中“city_id”为主键的城市名称)。

对于您要执行的操作,您应该将QSqlQueryModel与手动构造的查询一起使用而不是QSqlRelationalTableModel

答案 1 :(得分: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”表上的名称(或年龄);