3

User エンティティと Hobbie エンティティがあり、どちらも Loopback でモデルが定義されており、API Explorer でそれらを確認できます。

User と Hobbie を ManyToMany 関係でリンクするテーブル UserHobbie があります。次のようなループバックhasManyThrough関係を宣言しようとしています

User.hasMany(Hobbie, {through: UserHobbie});

しかし、エクスプローラーに表示されないため、うまくできないようです。/server/server.jsブートストラップ セクションの直後に宣言し、 /common/User.jsandで実行しようとしました/common/Hobbie.js(ただし、どちらか一方では、もう一方のモデルは表示されません)。

これを User.json または Hobbie.json に追加する適切な構文はありますか? json 定義に入力したものはすべてエクスプローラーに表示されるため、これが私の好ましい方法です。

4

2 に答える 2

9

モデル JSON 内の問題を解決するために、以下に解決策の概要を説明します。ただし、「hasAndBelongsToMany」リレーションシップを使用すると、問題をより簡単に解決できます。その概要も以下に示します。

User.json 内:

  "relations": {
    "Hobbies": {
      "type": "hasMany",
      "model": "Hobbie",
      "through": "UserHobbie",
      "foreignKey": "hobbieId"
    }
  }

Hobbie.json 内:

  "relations": {
    "Users": {
      "type": "hasMany",
      "model": "User",
      "through": "UserHobbie",
      "foreignKey": "userId"
    }
  }

UserHobbie.json は次のようになります (「プロパティ」内で userId または hobbieId を定義しないことに注意してください。

{
  "name": "UserHobbie",
  "plural": "UserHobbies",
  "base": "PersistedModel",
  "properties": {
    "id": {
      "type": "String",
      "id": true
    }
  },
  "validations": [],
  "relations": {
    "Users": {
        "type": "belongsTo",
        "model": "User",
        "foreignKey": "userId"
    },
    "Hobbies": {
        "type": "belongsTo",
        "model": "Hobbie",
        "foreignKey": "hobbieId"
    }
  },
  "acls": [],
  "methods": []
}

これを行う簡単な方法は次のとおりです。

UserHobbies モデルを明示的に作成しないでください。ループバックは自動的に結合モデルを作成します。

ユーザー モデル内:

  "relations": {
    "Hobbies": {
      "type": "hasAndBelongsToMany",
      "model": "Hobbie"
    }
  }

あなたのホビーモデルの中で:

  "relations": {
    "Users": {
      "type": "hasAndBelongsToMany",
      "model": "User"
    }
  }

コードでこれを行う場合は、正しいです。ブートストラップのタイミングの問題により、これらの関係がエクスプローラーに表示されません。すぐに別の応答を追加して、それを機能させる方法も示します。

于 2014-09-30T18:09:15.140 に答える
3

ここで、リレーションシップを作成する元のコード ベースの実装をエクスプローラーに表示するには、次のことを行う必要があります。

まず、ループバック プロジェクトの ./server/boot ディレクトリから、「explorer.js」を ./server (server.js がプロジェクト内にある場所) に移動します。

./server/server.js の最後の部分は次のようになります (簡潔にするためにいくつかのコメントを省略しました。

boot(app, __dirname);

... // Removed for brevity

app.use(loopback.urlNotFound());

// The ultimate error handler.
app.use(loopback.errorHandler());

app.start = function() {
  // start the web server
  return app.listen(function() {
    app.emit('started');
    console.log('Web server listening at: %s', app.get('url'));
  });
};

// start the server if `$ node server.js`
if (require.main === module) {
  app.start();
}

.server/server.js の最後の部分を次のように編集します。

boot(app, __dirname);
    // We took explorer.js out of /boot and put it in /server root next to server.js


var programmaticLoopbackSetup = require('./programmaticLoopbackSetup');
    // If the User has any special Programmatic Loopback Setup (create Model Relationships, etc.) do it first

if (programmaticLoopbackSetup !== undefined) {
    programmaticLoopbackSetup(app, finishUp);
}
else {
    finishUp();  // If you didn't want any Code based Setup
}

// Defer all the rest of the Startup Work until Explorer 
// has all the Model Info it needs from any Async or Programmatic Setup.
function finishUp() {

    require('./explorer')(app);
        // This was formerly done within "boot" above...

        ...  // removed for brevity...

    // Requests that get this far won't be handled
    // by any middleware. Convert them into a 404 error
    // that will be handled later down the chain.
    app.use(loopback.urlNotFound());

    // The ultimate error handler.
    app.use(loopback.errorHandler());

    app.start = function() {
      // start the web server
      return app.listen(function() {
        app.emit('started');
        console.log('Web server listening at: %s', app.get('url'));
      });
    };

    // start the server if `$ node server.js`
    if (require.main === module) {
      app.start();
    }
}

./server/programmaticLoopbackSetup.js に新しいファイルを追加し、以下のようにします (「起動」後、アプリの初期化を完了する前に呼び出される方法に注意してください)。

module.exports = function programmaticLoopbackSetup(app, next) {
    var User = app.models.User;
    var Hobbie = app.models.Hobbie;


    // This Block Below Creates a Many to Many User / Hobbie Relationship directly 

        User.hasAndBelongsToMany(Hobbie);
        Hobbie.hasAndBelongsToMany(User);

    next();  // Callback to finish App Init...
};

エクスプローラー内にユーザー/趣味関係 (この場合は「hasAndBelongsToMany」を使用) が表示されます。programmaticLoopbackSetup.js 内でコードベースの LoopBack モデル、データソース、またはその他の改良を行います

于 2014-10-02T05:08:13.440 に答える