1

私はbookshelfJSを使い始めたばかりで、次のことを行う方法について明確な答えを見つけることができませんでした.

次のテーブルがあるとします。

product
--------
id


product_account
--------
id
product_id
account_id


collection
--------
id


collection_product_account
--------
collection_id
product_account_id

コレクションには多くの製品が含まれる場合があります。

私は次のことをしたい

SELECT pa.*, p.* FROM product_account pa 
INNER JOIN collection_product_account cp ON cp.product_account_id = pa.id 
INNER JOIN product p ON p.product_account_id = pa.product_id 
WHERE cp.collection_id = ?

コレクション ID を渡し、product_accounts の全リストを返し、そこから製品を取得するにはどうすればよいでしょうか?

参考までに、product_account_id でクエリを実行している場合は、これを行っています。

new productAccountModel()
.where({account_id: 1})
.fetchAll({withRelated: ['product']})
.then(function(productAccounts)
{
  return productAccounts.toJSON());
});
4

1 に答える 1

3

これがあなたのモデルだと思います:

var Product = bookshelf.Model.extend({
    tableName: 'product',
    collections: function() {
        return this.belongsToMany(Collection);
    }
});

var Collection = bookshelf.Model.extend({
    tableName: 'collection',
    products: function() {
        return this.belongsToMany(Product);
    }
});

次に、ロジックを少し切り替える必要があります。と言うとnew Product()、これを関連テーブルでクエリすることはできません。ただし、次のように切り替えることができます。

new Collection({id: 1}).fetch({
    withRelated: ['products']
}).then(function(result) {
    res.json(result.toJSON());
});

これは役に立ちますか?

アップデート:

必要に応じて、アタッチしているモデルからリレーションをさらにアタッチできます。つまり、次のようになります。

new Collection({id: 1}).fetch({
    withRelated: ['products.company']
}).then(function(result) {
    res.json(result.toJSON());
});
于 2015-04-26T08:57:09.517 に答える