Skip to content

Commit 02c11e5

Browse files
committed
Support multi-field relations in createRelation().
Allow creating relations from a map of referenced->referencing fields.
1 parent 6e84384 commit 02c11e5

File tree

3 files changed

+20
-10
lines changed

3 files changed

+20
-10
lines changed

src/core/utils/relationutils.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,27 @@ QgsRelation RelationUtils::resolveReferencingRelation( QgsProject *project, QgsV
4545
return QgsRelation();
4646
}
4747

48-
QgsRelation RelationUtils::createRelation( const QgsVectorLayer *referencedLayer, const QString &referencedFieldName, const QgsVectorLayer *referencingLayer, const QString &referencingFieldName )
48+
QgsRelation RelationUtils::createRelation( const QgsVectorLayer *referencedLayer, const QgsVectorLayer *referencingLayer, const QVariantMap &fieldPairs )
4949
{
50-
if ( !referencedLayer || !referencingLayer )
50+
if ( !referencedLayer || !referencingLayer || fieldPairs.isEmpty() )
5151
return QgsRelation();
5252

53-
const QString relationId = QStringLiteral( "%1_%2_%3_%4" ).arg( referencedLayer->id(), referencedFieldName, referencingLayer->id(), referencingFieldName );
53+
QStringList fieldPairStrings;
54+
for ( QVariantMap::const_iterator it = fieldPairs.constBegin(); it != fieldPairs.constEnd(); ++it )
55+
{
56+
fieldPairStrings.append( QStringLiteral( "%1_%2" ).arg( it.key(), it.value().toString() ) );
57+
}
58+
const QString relationId = QStringLiteral( "%1_%2_%3" ).arg( referencedLayer->id(), fieldPairStrings.join( "_" ), referencingLayer->id() );
5459

5560
QgsRelation relation;
5661
relation.setId( relationId );
57-
relation.setName( QStringLiteral( "%1 (%2) <-> %3 (%4)" ).arg( referencedLayer->name(), referencedFieldName, referencingLayer->name(), referencingFieldName ) );
62+
relation.setName( QStringLiteral( "%1 (%2) <-> %3 (%4)" ).arg( referencedLayer->name(), fieldPairs.constBegin().key(), referencingLayer->name(), fieldPairs.constBegin().value().toString() ) );
5863
relation.setReferencedLayer( referencedLayer->id() );
5964
relation.setReferencingLayer( referencingLayer->id() );
60-
relation.addFieldPair( referencingFieldName, referencedFieldName );
6165

66+
for ( QVariantMap::const_iterator it = fieldPairs.constBegin(); it != fieldPairs.constEnd(); ++it )
67+
{
68+
relation.addFieldPair( it.value().toString(), it.key() );
69+
}
6270
return relation;
6371
}

src/core/utils/relationutils.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ class RelationUtils : public QObject
3737
* Note: Layers must be added to the project first
3838
*
3939
* \param referencedLayer The referenced (parent) layer
40-
* \param referencedFieldName The field name in the referenced layer
4140
* \param referencingLayer The referencing (child) layer
42-
* \param referencingFieldName The field name in the referencing layer that references the parent
41+
* \param fieldPairs A map where keys are referenced field names and values are referencing field names
4342
* \returns A QgsRelation object
4443
*/
45-
Q_INVOKABLE QgsRelation createRelation( const QgsVectorLayer *referencedLayer, const QString &referencedFieldName,
46-
const QgsVectorLayer *referencingLayer, const QString &referencingFieldName );
44+
Q_INVOKABLE QgsRelation createRelation( const QgsVectorLayer *referencedLayer,
45+
const QgsVectorLayer *referencingLayer,
46+
const QVariantMap &fieldPairs );
4747
};
4848

4949
#endif // RELATIONUTILS_H

test/qml/tst_relations.qml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ TestCase {
4242
ProjectUtils.addMapLayer(qgisProject, referencingLayer);
4343

4444
// 4) Create and register relation
45-
let relation = RelationUtils.createRelation(referencedLayer, "district_uuid", referencingLayer, "parent_district_uuid");
45+
let relation = RelationUtils.createRelation(referencedLayer, referencingLayer, {
46+
"district_uuid": "parent_district_uuid"
47+
});
4648
verify(relation.isValid, "Relation should be valid");
4749
let relationManager = qgisProject.relationManager;
4850
relationManager.addRelation(relation);

0 commit comments

Comments
 (0)