Inverted Relation Retrieval¶
Backendless supports a special query syntax for loading a subset of child objects for a specific parent. Consider the following table schemas:
PhoneBook table:
Contact table:
Address table:
These tables will be used to demonstrate how to query Backendless for conditional related object retrieval.
The Map-based approach does not require you defining classes for the objects stored in Backendless. Instead your code can use Map to to store and retrieve objects in/from Backendless. === "Custom Class"
Consider the following class definitions for the entities from the diagram: PhoneBook class:
import 'package:backendless_sdk/backendless_sdk.dart';
import 'contact.dart';
@reflector
class PhoneBook {
String objectId;
Contact owner;
List<Contact> contacts;
}
import 'package:backendless_sdk/backendless_sdk.dart';
import 'address.dart';
@reflector
class Contact {
String objectId;
String name;
int age;
String phone;
String title;
Address address;
DateTime updated;
}
import 'package:backendless_sdk/backendless_sdk.dart';
@reflector
class Address {
String street;
String city;
String state;
}
The general structure of a whereClause query to load a collection of child objects for a specific parent object is:
ParentTableName[ relatedColumnName ].parentColumnName COLUMN-VALUE-CONDITION
Both columns relatedColumnName
and parentColumnName
must be declared in a table with name of ParentTableName
. The relatedColumnName
must be a relation column. The table relatedColumnName
points to is the table where the objects must be loaded from. The examples below demonstrate the usage of this syntax:
Find all contacts in a city for a specific phone book¶
String whereClause = "PhoneBook[contacts].objectId='${savedPhoneBook["objectId"]}' and address.city = 'Smallville'";
DataQueryBuilder queryBuilder = DataQueryBuilder()
..whereClause = whereClause;
Backendless.data.of( "Contact" ).find( queryBuilder );
String whereClause = "PhoneBook[contacts].objectId='${savedPhoneBook.objectId}' and address.city = 'Smallville'";
DataQueryBuilder queryBuilder = DataQueryBuilder()
..whereClause = whereClause;
Backendless.data.withClass<Contact>().find( queryBuilder );
Codeless Reference¶
The following example is identical to the one presented above and uses the following condition in thewhere clause
property: This operation is set to retrieve related objects whose city is 'New York'
.
PhoneBook[contacts].objectId = 'DB7A04FD-C305-4615-8480-BF75F244F10F' and address.city = 'New York'
Important
For a detailed description of all input parameters see the Basic Object Retrieval topic of this guide.
After the Codeless logic runs, the operation returns two objects whose city is 'New York'
.
Find all contacts for the specific phone book where the city name contains letter 'a'¶
String whereClause = "PhoneBook[contacts].objectId='${savedPhoneBook["objectId"]}' and address.city like '%a%'";
DataQueryBuilder queryBuilder = DataQueryBuilder()
..whereClause = whereClause;
Backendless.data.of( "Contact" ).find( queryBuilder );
String whereClause = "PhoneBook[contacts].objectId='${savedPhoneBook.objectId}' and address.city like '%a%'";
DataQueryBuilder queryBuilder = DataQueryBuilder()
..whereClause = whereClause;
Backendless.data.withClass<Contact>().find( queryBuilder );
Codeless Reference¶
The following example is identical to the one presented above and uses the following condition in thewhere clause
property. This operation is set to retrieve related objects whose name of the city contains at least one letter 'a'
.
PhoneBook[contacts].objectId = 'DB7A04FD-C305-4615-8480-BF75F244F10F' and address.city like '%a%'
After the Codeless logic runs, the operation returns four objects that have at least one letter 'a'
in the name of the city.
Find all contacts where age is greater than 20 for a specific phone book¶
String whereClause = "PhoneBook[contacts].objectId='${savedPhoneBook["objectId"]}' and age > 20";
DataQueryBuilder queryBuilder = DataQueryBuilder()
..whereClause = whereClause;
Backendless.data.of( "Contact" ).find( queryBuilder );
String whereClause = "PhoneBook[contacts].objectId='${savedPhoneBook.objectId}' and age > 20";
DataQueryBuilder queryBuilder = DataQueryBuilder()
..whereClause = whereClause;
Backendless.data.withClass<Contact>().find( queryBuilder );
Codeless Reference¶
The following example is identical to the one presented above and uses the following condition in thewhere clause
property: This operation is set to retrieve related objects whose age
is greater than 20
.
PhoneBook[contacts].objectId = 'DB7A04FD-C305-4615-8480-BF75F244F10F' and age > 20
After the Codeless logic runs, the operation returns four objects that match the where clause
condition. As you can see, the value in the age
property is greater than 20
.
Find all contacts for a specific phone book where age is within the specified range¶
String whereClause = "PhoneBook[contacts].objectId='${savedPhoneBook["objectId"]}' and age >= 21 and age <= 30";
DataQueryBuilder queryBuilder = DataQueryBuilder()
..whereClause = whereClause;
Backendless.data.of( "Contact" ).find( queryBuilder );
String whereClause = "PhoneBook[contacts].objectId='${savedPhoneBook.objectId}' and age >= 21 and age <= 30";
DataQueryBuilder queryBuilder = DataQueryBuilder()
..whereClause = whereClause;
Backendless.data.withClass<Contact>().find( queryBuilder );
Codeless Reference¶
The following example is identical to the one presented above and uses the following condition in thewhere clause
property: This operation is set to retrieve related objects using the age
properties whose values are in range between 21
and 30
.
PhoneBook[contacts].objectId = 'DB7A04FD-C305-4615-8480-BF75F244F10F' and age >= 21 and age <= 30
After the Codeless logic runs, the operation returns only one object since it matches the where clause
condition.
Find all contacts for a specific phone book where age is greater than 20 and the city is Tokyo¶
String whereClause = "PhoneBook[contacts].objectId='${savedPhoneBook["objectId"]}' and age > 20 and address.city = 'Tokyo'";
DataQueryBuilder queryBuilder = DataQueryBuilder()
..whereClause = whereClause;
Backendless.data.of( "Contact" ).find( queryBuilder );
String whereClause = "PhoneBook[contacts].objectId='${savedPhoneBook.objectId}' and age > 20 and address.city = 'Tokyo'";
DataQueryBuilder queryBuilder = DataQueryBuilder()
..whereClause = whereClause;
Backendless.data.withClass<Contact>().find( queryBuilder );
String whereClause = "PhoneBook[contacts].objectId='${savedPhoneBook.objectId}' and age > 20 and address.city = 'Tokyo'";
DataQueryBuilder queryBuilder = DataQueryBuilder()
..whereClause = whereClause;
Backendless.data.withClass<Contact>().find( queryBuilder );