Skip to content

Functions: RecordsResource: Joins

Florian Fehring edited this page Apr 20, 2026 · 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.

Funktion 45: Abfrage von Datensätzen inkl. des Datensatzes eines verbundenen Tabelle

  1. 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:

  1. 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
        }
      ]
    },...

Funktion 46: Abfrage von Datensätzen inkl. aller referenzierten Datensätze

  1. 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:

  1. 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

  1. 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:

  1. 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
        }
      ]
    }
  ]
}

Clone this wiki locally