-
Notifications
You must be signed in to change notification settings - Fork 2
Functions: RecordsResource: Joins
SmartData kann Joins verwenden um Datensätze inkl. ihrer referenzierten Datensätze aus einer anderen Tabelle abzufragen. Die Joins sind selbst auflösend, d.h. die referenzierenden Spalten müssen nicht angegeben werden.
SmartData Joins unterstützen den vollen Umfang wie die TreeQL Dokumentation.
- Die Joins funktionieren nur, wenn auch in der DB die entsprechenden Fremdschlüssel korrekt eingetragen wurden
- immer den Storage als Parameter angeben wenn dieser nicht public (default storage) ist. Zum Beispiel:
GET ../smartdata/records/{collection}/?storage={smartmonitoring}
Let’s say that you have a posts table that has comments (made by users) and the posts can have tags.
posts comments users post_tags tags
======= ======== ======= ========= =======
id id id id id
title post_id username post_id name
content user_id phone tag_id
created message
When you want to list posts with their comments users and tags you can ask for two “tree” paths:
posts -> comments -> users
posts -> post_tags -> tags
These paths have the same root and this request can be written in URL format as:
GET /records/posts?join=comments,users&join=tags
Here you are allowed to leave out the intermediate table that binds posts to tags. In this example you see all three table relation types (hasMany, belongsTo and hasAndBelongsToMany) in effect:
- “post” has many “comments”
- “comment” belongs to “user”
- “post” has and belongs to many “tags”
This may lead to the following JSON data:
{
"records":[
{
"id": 1,
"title": "Hello world!",
"content": "Welcome to the first post.",
"created": "2018-03-05T20:12:56Z",
"comments": [
{
id: 1,
post_id: 1,
user_id: {
id: 1,
username: "mevdschee",
phone: null,
},
message: "Hi!"
},
{
id: 2,
post_id: 1,
user_id: {
id: 1,
username: "mevdschee",
phone: null,
},
message: "Hi again!"
}
],
"tags": []
},
{
"id": 2,
"title": "Black is the new red",
"content": "This is the second post.",
"created": "2018-03-06T21:34:01Z",
"comments": [],
"tags": [
{
id: 1,
message: "Funny"
},
{
id: 2,
message: "Informational"
}
]
}
]
}
You see that the “belongsTo” relationships are detected and the foreign key value is replaced by the referenced object. In case of “hasMany” and “hasAndBelongsToMany” the table name is used a new property on the object.
Es ist möglich auch Joins- und Filter-Parameter gleichzeitig zu werden. Jedoch kann man damit nur die Tabelle aus der URL filtern und nicht nicht die Tabellen aus dem Join-Parameter. Beispiel:
GET ../smartdata/records/{table}/?storage={storage}&join={joinTable}&filter=id,eq,1
Hier bezieht sich der Filter immer auf table und nicht auf joinTable.
Für Include-Parameter analog.
- Es können Datensätze aus Tabelle 1 abgefragt werden und dabei wird der jeweils mit einem Datensatz verbundene Datensatz aus Tabelle 2 mit ausgeliefert.
- /records/tbl_location_join_oo?storage=smartmonitoring&size=20&join=tbl_location
- Datensätze aus tbl_location_join_oo werden ausgeliefert, jeweils mit dem Zugehörigen Datensatz aus tbl_location
- Es wird mit Status 200 OK und einer Liste von Datensätzen mit je einem Array das einen Unterdatensatz enthält geantwortet
- Es werden keine Datensätze ausgeliefert, bei denen kein zugehöriger Datensatz vorhanden ist
Ausnahmen:
- Eine der angegebenen Tabellen existiert nicht
- Es wird mit Status 400 NOT FOUND geantwortet
Einschränkungen:
- Die Angabe der Einschränkung der auszuliefernden Attribute schränkt nur auf der Ausgangstabelle ein
- Die Funktionsfähigkeit von Filtern ist nur auf der Ausgangstabelle garantiert
Ergebnis z.B.
{
"records": [
{
"oo_id": 1,
"id": 1,
"loc_id": 3,
"tbl_location": [
{
"city": "",
"postcode": "",
"description": "null",
"housenumber": "",
"street": "",
"name": "DC:A6:32:35:80:3E",
"id": 3
}
]
},...
- Es können Datensätze aus Tabelle 1 abgerufen werden und alle verbundenen Datensätze aus Tabelle 2 werden mit ausgeliefert
- /records/tbl_observedobject?storage=smartmonitoring&size=20&join=tbl_location_join_oo
- Datensätze werden aus tbl_observedobject ausgeliefert, mit allen referenzierten Datensätzen aus tbl_locaction_join_oo in einem Array
- Es wird mit Status 200 OK und einer Liste von Datensätzen inkl. einem Array von Unterdatensätzen genantwortet
Ausnahmen:
- Eine der angegebenen Tabellen existiert nicht
- Es wird mit Status 400 NOT FOUND geantwortet
Einschränkungen:
- Die Angabe der Einschränkung der auszuliefernden Attribute schränkt nur auf der Ausgangstabelle ein
- Die Funktionsfähigkeit von Filtern ist nur auf der Ausgangstabelle garantiert
Ergebnis z.B.:
{
"records": [
{
"parent_id": 80,
"type_id": 1,
"name": "Environwohnung 001",
"id": 1,
"manualcapture": false,
"tbl_location_join_oo": [
{
"oo_id": 1,
"id": 1,
"loc_id": 3
},
{
"oo_id": 1,
"id": 2,
"loc_id": 4
}
]
}
]
}
Funktion 47: Abfrage von Datensätzen aus Tabelle 1 mit Auflistung aller über eine Verbindungstabelle verknüpften Tabelle 3
- Es können die Datensätze aus Tabelle 1 inkl. einer Auflisung aller verbundenen Datensätze aus Tabelle 3 abgefragt werden.
- /records/tbl_observedobject?storage=smartmonitoring&size=20&join=tbl_location_join_oo%2Ctbl_location
- Datensätze werden aus tbl_observedobject ausgeliefert, mit allen referenzierten Datensätzen aus tbl_locaction in einem Array. Die Verbindungstabelle ist tbl_location_join_oo
- Es wird mit Status 200 OK und einer Liste von Datensätzen inkl. einem Array von Unterdatensätzen genantwortet
Ausnahmen:
- Eine der angegebenen Tabellen existiert nicht
- Es wird mit Status 400 NOT FOUND geantwortet
Einschränkungen:
- Die Angabe der Einschränkung der auszuliefernden Attribute schränkt nur auf der Ausgangstabelle ein
- Die Funktionsfähigkeit von Filtern ist nur auf der Ausgangstabelle garantiert
Ergebnis z.B.:
{
"records": [
{
"parent_id": 80,
"type_id": 1,
"name": "Environwohnung 001",
"id": 1,
"manualcapture": false,
"tbl_location": [
{
"city": "",
"postcode": "",
"description": "null",
"housenumber": "",
"street": "",
"name": "DC:A6:32:35:80:3E",
"id": 3
},
{
"city": "",
"postcode": "",
"description": "null",
"housenumber": "",
"street": "",
"name": "DC:A6:32:35:80:11",
"id": 4
}
]
}
]
}