我似乎陷入了经典的ORM问题,并且不知道如何处理它,所以在这一点上欢迎任何帮助。
有没有办法在hasManyThrough查询上获取数据透视表?更好的是,应用一些过滤器或排序。一个典型的例子
表产品
id,title
表类别
id,title
table products_categories
productsId, categoriesId, orderBy, main
因此,在上面的场景中,假设您希望获得所有类别的产品X(main = true),或者您希望按orderBy
对产品类别进行排序。
现在发生的是获取产品数据的第一个SELECT
产品,产品数据上的第二个SELECT
来获取categoriesId
和最后SELECT
个类别得到实际的类别。理想情况下,过滤器和排序应该应用于第二个SELECT
SELECT `id`,`productsId`,`categoriesId`,`orderBy`,`main` FROM `products_categories` WHERE `productsId` IN (180) WHERE main = 1 ORDER BY `orderBy` DESC
另一个典型的例子是希望根据用户想要的订单来订购产品图片
所以你有一个products_images表
id,image,productsID,orderBy
你想要
SELECT from products_images WHERE productsId In (180) ORDER BY orderBy ASC
这甚至可能吗?
编辑:这是中间表根据我的架构获得所需内容所需的关系。
Products.hasMany(Images,
{
as: "Images",
"foreignKey": "productsId",
"through": ProductsImagesItems,
scope: function (inst, filter) {
return {active: 1};
}
});
东西是范围功能让我可以访问最终结果,而不是中间表。
答案 0 :(得分:4)
我不确定是否完全理解您的问题,但您肯定需要摆脱表格概念,并在模型和关系方面表达您的问题。
我看到它的方式,你有两个模型产品(属性:标题)和类别(属性:主要)。
然后,您可以在两者之间建立关系,可能
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.MenuItem', AncestorLevel='1''. BindingExpression:Path=Foreground; DataItem=null; target element is 'Rectangle' (Name=''); target property is 'Fill' (type 'Brush')
Product belongsTo Category
这意味着产品属于单一类别,而类别可能包含许多产品。有other relations available
然后,使用生成的REST API,您可以过滤GET请求以获取其属性功能的项目(例如您的Category hasMany Product
),或使用自定义GET请求(在添加关系时自动生成)例如,获取属于特定类别的所有产品。
这有帮助吗?
答案 1 :(得分:3)
根据您的内容,我可能会建议您在定义关系时使用scope
选项。 LoopBack文档显示了非常相似的example of the "product - category" scenario:
Product.hasMany(Category, {
as: 'categories',
scope: function(instance, filter) {
return { type: instance.type };
}
});
在上面的示例中,instance
是一个匹配的类别,每个产品都有一个新的categories
属性,该属性将包含{{1}的匹配Category
个实体}}。请注意,这不符合您的确切数据方案,因此您可能需要使用它。此外,我认为您的API查询必须指定您希望加载Product
相关数据(默认情况下不包括这些数据):
categories
答案 2 :(得分:2)
我建议您在Product.js中定义一个自定义/远程方法,为您完成工作。
Product.getCategories(_productId){
// if you are taking product title as param instead of _productId,
// you will first need to find product ID
// then execute a find query on products_categories with
// 1. where filter to get only main categoris and productId = _productId
// 2. include filter to include product and category objects
// 3. orderBy filter to sort items based on orderBy column
// now you will get an array of products_categories.
// Each item / object in the array will have nested objects of Product and Category.
}