2017-06-24 5 views
0

私はbookshelfとknexを使ってPostgreSQLデータベースに接続しています。私は1対1の関係を持つデータを検索しようとしています。ブックシェルフを使用して1対多のオブジェクトを出力する方法js

表::私のデータベースは、このようになりますアスリート

|----------------------------| 
| id | firstname | lastname | 
|----------------------------| 
| 0 | john  | doe  | 
| 1 | jane  | doe  | 
|----------------------------| 

表:アクティビティマイ本棚モデルは次のようになり

|------------------------------------| 
| id | athlete_id | type | distance | 
|------------------------------------| 
| 0 |  1  | run | 5  | 
| 1 |  0  | walk | 7  | 
|------------------------------------| 

const Athlete = bookshelf.Model.extend({ 
    tableName: 'athlete', 
    activities: function() { 
     return this.hasMany('Activity', 'athlete_id'); 
    } 
}); 

const Activity = bookshelf.Model.extend({ 
    tableName: 'activity', 
    athlete: function() { 
     return this.belongsTo('Athlete'); 
    } 
}); 

その後、私はActivity.fetchAll().then(...)

呼び出します

これは私がそれを返すようにしたいどのような

[ 
    { 
    "id": "0", 
    "athlete_id": "1", 
    "type": "run", 
    "distance": "5", 
    }, 
    { 
    "id": "1", 
    "athlete_id": "0", 
    "type": "walk", 
    "distance": "7", 
    } 
] 

返すことは、私はこれを見つけた

[ 
    { 
    "id": "0", 
    "athlete": { 
     "athlete_id": "1", 
     "firstname": "jane", 
     "lastname": "doe" 
    }, 
    "type": "run", 
    "distance": "5", 
    }, 
    { 
    "id": "1", 
    "athlete": { 
     "athlete_id": "0", 
     "firstname": "john" 
     "lastname": "doe" 
    }, 
    "type": "walk", 
    "distance": "7", 
    } 
] 

です:Activity.fetch({withRelated: 'athlete'}).then(...)が、それはメッセージなしで私のために500エラーを返します。

ネストされたオブジェクトを返すのに役立つ必要があります。

答えて

1

athleteの前後に大括弧が1組ありません。これはこのエラーを引き起こす可能性があります。

Activity.fetch({withRelated: ['athlete']}).then(...)

EDITは@Derekedelaneyねえ、私は、同じプロジェクトを実施しようとしたすべての問題に直面していませんでした。あなたはそれを見つけることができますhere。私は私がかつてその経る本棚レジストリプラグインを使用していますので、予めご了承ください。この

[ { id: 1, athlete_id: 1, type: 'run', distance: '5', athlete: { id: 1, firstname: 'john', lastname: 'doe' } }, { id: 2, athlete_id: 2, type: 'walk', distance: '7', athlete: { id: 2, firstname: 'jane', lastname: 'doe' } } ]

のような出力を得ました。あなたに何か問題がある場合は教えてください。

+0

おかげで、私はまだ '[]' – Derekedelaney

+0

@Derekedelaneyと同じエラーを取得しています:私はあなたのfetch()コードにcatch節を追加することをお勧めします、何かのようにこれだけのためですか? –

+0

これがエラーの原因だと私は信じています。 'fetchAll()'を使うことはできません。私の関係はすべて台無しだと思うし、本棚は私から何かを見逃していると思う。私はそれが何であるか分かりません。 – Derekedelaney

1

テーブルには非標準の主キーが使用されているため、idAttributeプロパティを使用してテーブルを指定する必要があります。単にモデルを次のように変更してください:

const Athlete = bookshelf.Model.extend({ 
    tableName: 'athlete', 
    idAttribute: 'athlete_id' 
    activities: function() { 
     return this.hasMany('Activity', 'athlete_id'); 
    } 
}); 

const Activity = bookshelf.Model.extend({ 
    tableName: 'activity', 
    idAttribute: 'activity_id' 
    athlete: function() { 
     return this.belongsTo('Athlete'); 
    } 
}); 

また、単純な500のHTTPステータスを取得することは役に立ちません。あなたは必ずエラーあなたにある助けるため

Activity 
    .fetch({withRelated: ['athlete']}) 
    .then(...) 
    .catch(ex => { 
    log.err('Error while fetching', ex); // or at least 'console.dir(ex)' 
    throw ex; 
    }) 
+0

フィードバックはありますが、まだ運がありません。標準の主キーを推測すると、 'athlete_id'の代わりに' id'だけになります。また、私は「then」からエラーをキャッチしているが、「ex」は空のオブジェクトであることを明確にすべきである。最後に、 'idAttribute: 'athele_id''は単にタイプミスであったと仮定しています。 'idAttribute: 'athlete_id''を追加しました – Derekedelaney

+0

タイポが修正されました。私は空の例外を見たことがない( 'throw undefined'?)。 Knex/Boolshelfの例外は時には謎めいているかもしれませんが、常に非常に詳細です。私はそれを二重に確認することをお勧めします。 – flaviodesousa

+0

私はデバッグを使用しています。メッセージ: url/v1/activities + 0msからのルータのトリムプレフィックス(/ v1/activities) express:ルータルータ/ v1/activities:/ v1/activities + 0ms express:ルータディスパッチGET/1ms knex:プールINFOプールpostgresql:pg:client0 - ディスペンス()クライアント= 1使用可能= 2 + 8ms knex:クライアントはプールから接続を取得しました:__knexUid1 + 1ms knex:query select "activity"。* "activity"限界? + 6ms knex:bindings [1] + 0ms knex:クライアントからプールへの接続を解除する:__knexUid1 + 6ms knex:プールINFOプールpostgresql:pg:client0 - ディスペンス()クライアント= 0利用可能= 2 + 0ms''' – Derekedelaney

関連する問題