Search code examples
node.jsloopbackjsstronglooploopback

Loopback can't fetch data with self through relation


Member model based on User model

   {
      "name": "Member",
      "base": "User",
      "idInjection": true,
      "options": {
        "validateUpsert": true
      },
      "properties": {
        "nickname": {
          "type": "string"
        }
      },
      "validations": [],
      "relations": {
        "messages": {
          "type": "hasMany",
          "model": "Message",
          "foreignKey": ""
        },
        "followers": {
          "type": "hasMany",
          "model": "Member",
          "foreignKey": "followeeId",
          "through": "Follow"
        },
        "followings": {
          "type": "hasMany",
          "model": "Member",
          "foreignKey": "followerId",
          "through": "Follow"
        }
      },
      "acls": [
        {
          "accessType": "*",
          "principalType": "ROLE",
          "principalId": "$everyone",
          "permission": "DENY"
        },
        {
          "principalType": "ROLE",
          "principalId": "$owner",
          "permission": "ALLOW",
          "property": "__get__followers"
        },
        {
          "principalType": "ROLE",
          "principalId": "$owner",
          "permission": "ALLOW",
          "property": "__get__followings"
        },
        {
          "principalType": "ROLE",
          "principalId": "$owner",
          "permission": "ALLOW",
          "property": "__get__messages"
        }
      ],
      "methods": {}
    }

Follow model

{
  "name": "Follow",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {},
  "validations": [],
  "relations": {
    "follower": {
      "type": "belongsTo",
      "model": "Member",
      "foreignKey": ""
    },
    "followee": {
      "type": "belongsTo",
      "model": "Member",
      "foreignKey": ""
    }
  },
  "acls": [],
  "methods": {}
}

Example 1

enter image description here

With this data in the database I have the same error when I try to fetch following and followers with member 1.

Erreur non traitée pour la demande GET /api/Members/1/followers?access_token=t0oAVZM2CLJ7XLqQm2zxz8wj3fLmtUATHopDM40WYknLURbiObpVAlSD3DBEIOfv : Error: La relation "member" n'est pas définie pour le modèle Follow
        at processIncludeItem (/home/thomas/Bureau/Projet/Project/node_modules/loopback-datasource-juggler/lib/include.js:289:10)
        at /home/thomas/Bureau/Projet/Project/node_modules/loopback-datasource-juggler/lib/include.js:180:5
        at /home/thomas/Bureau/Projet/Project/node_modules/async/dist/async.js:3025:16
        at eachOfArrayLike (/home/thomas/Bureau/Projet/Project/node_modules/async/dist/async.js:940:9)
        at eachOf (/home/thomas/Bureau/Projet/Project/node_modules/async/dist/async.js:990:5)
        at Object.eachLimit (/home/thomas/Bureau/Projet/Project/node_modules/async/dist/async.js:3089:3)
        at Function.Inclusion.include (/home/thomas/Bureau/Projet/Project/node_modules/loopback-datasource-juggler/lib/include.js:179:9)
        at /home/thomas/Bureau/Projet/Project/node_modules/loopback-connector-postgresql/node_modules/loopback-connector/lib/sql.js:1203:44
        at /home/thomas/Bureau/Projet/Project/node_modules/loopback-datasource-juggler/lib/observer.js:172:22
        at doNotify (/home/thomas/Bureau/Projet/Project/node_modules/loopback-datasource-juggler/lib/observer.js:99:49)
        at PostgreSQL.ObserverMixin._notifyBaseObservers (/home/thomas/Bureau/Projet/Project/node_modules/loopback-datasource-juggler/lib/observer.js:122:5)
        at PostgreSQL.ObserverMixin.notifyObserversOf (/home/thomas/Bureau/Projet/Project/node_modules/loopback-datasource-juggler/lib/observer.js:97:8)
        at cbForWork (/home/thomas/Bureau/Projet/Project/node_modules/loopback-datasource-juggler/lib/observer.js:162:14)
        at /home/thomas/Bureau/Projet/Project/node_modules/loopback-connector-postgresql/node_modules/loopback-connector/lib/sql.js:428:7
        at Query.<anonymous> (/home/thomas/Bureau/Projet/Project/node_modules/loopback-connector-postgresql/lib/postgresql.js:162:7)
        at Query.handleReadyForQuery (/home/thomas/Bureau/Projet/Project/node_modules/pg/lib/query.js:124:10)

Example 2

enter image description here

With this data in the database here is the result when I try to fetch followers with member 1. enter image description here

I don't understand why i'm not able to fetch data in these two examples. BTW i'm using PostgreSQL. Thanks.


Solution

  • You need to fix relations in Follow model according to Member.

    {
      "name": "Follow",
      "base": "PersistedModel",
      "idInjection": true,
      "options": {
        "validateUpsert": true
      },
      "properties": {},
      "validations": [],
      "relations": {
        "follower": {
          "type": "belongsTo",
          "model": "Member",
          "foreignKey": "followeeId"
        },
        "followee": {
          "type": "belongsTo",
          "model": "Member",
          "foreignKey": "followerId"
        }
      },
      "acls": [],
      "methods": {}
    }
    

    And in member.json

    ...
    "followers": {
              "type": "hasMany",
              "model": "Member",
              "foreignKey": "followeeId",
              "keyThrough": "followerId",
              "through": "Follow"
            },
            "followings": {
              "type": "hasMany",
              "model": "Member",
              "foreignKey": "followerId",
              "keyThrough": "followeeId",
              "through": "Follow"
            }
    ...