Skip to content

Funktionen_Joins

Florian Fehring edited this page May 7, 2024 · 1 revision

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.

Joins

SmartData Joins unterstützen den vollen Umfang wie die TreeQL Dokumentation.

Wichtige Hinweise

  • 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}

TreeQL Join

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.

Join und Filter/Include

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.