-
Notifications
You must be signed in to change notification settings - Fork 0
Funktionen_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.