如何使用knexjs查询连接表?

时间:2016-01-02 19:49:33

标签: node.js knex.js

我使用(NodeJS,ExpressJS,KnexJS和Postgres)设置基本博客API。每个博客都有很多类别。因此,当我查询博客时,我也会获得每个博客的类别。同时每个类别可以有很多博客。我可能想按类别查询博客帖子。所以我设置了3个表:

Blog TABLE()COLUMNS {id,title,description,slug}

类别表格列 {id,name,slug}

CatBlog TABLE(交汇表)COLUMNS {cat_id,blog_id}

当我查询博客文章时,我也想要一个类别数组。

{
      "id": 14,
      "title": "Title for a recipe coming soon",
      "description":"",
      "slug": "title-for-a-recipe-coming-soon",
      "categories": [
        {
          "id": 6,
          "name": "Business",
          "slug": "business"
        },
        {
          "id": 7,
          "name": "Marketing",
          "slug": "marketing"
        },
        {
          "id": 8,
          "name": "Chef",
          "slug": "chef"
        }
      ]
    }

我使用KnexJS来处理我的查询,但我没有看到如何处理联结表。 如何使用CatBlog表从Category表中添加类别来获取它们?

2 个答案:

答案 0 :(得分:1)

不确定此代码是否有效,但这是我的方法

我建议你使用下划线/ lodash和一些像asyncjs这样的控制流模块。

function loadBlogPosts(callback){
    // fetching 10 blogpost
    knex("blog").select("*").limit(10)
      .then(function(posts){
         callback(null,posts)
      })
      .catch(function(err){
        callback(err);
      })
}

function loadCategories(posts,callback){
    // making an array from post ids
    var postIds = _.pluck(posts,'id');
    // join with blog_category table
    knex("category").join("blog_category","category.id","blog_category.cat_id").whereIn({"blog_category.blog_id":postIds}).select("category.*","blog_category.blog_is as blog_id")
        .then(function(categories){
            callback(null,posts,categories)
        })
        .catch(function(err){
            callback(err);
        })
}


async.waterfall([loadBlogPosts,loadCategories],function(err,posts,categories){
    var post_list = _.map(posts,function(post){
        post.categories = _.find(categories,{blog_id: post.id});
    })
})

在此示例中,您只发送请求2查询(1个用于帖子,1个用于类别),这在性能方面要好得多。

答案 1 :(得分:0)

我不确定这是否是最佳答案,但我能够进行查询

//Run the select on the table I am attempting to query to get all the data I need.
knex.select('*').from('Blog')
	.then(function(data){
  //Once I have the data run a then with the array so that I can iterate over each item.
		data.map(function(item){
          //For each Item I am querying the CatBlog table and then if the item.id matches the blog_id I will grab that cat_id. Once I am inside the this query I also run a join to add the categories table on each cat_id that I find. and then lastly I can also select the columns I would like to display.
			return knex('CatBlog').whereIn('blog_id',item.id).join('Categories', 'cat_id','=','Categories.id').select('id','name','slug')
            //I take that data and pass a new key for each item called categories. Each key has a value of the query.
			.then(function(data){
				item['categories'] = data;
			});
          
		});
    	res.json(data);
    })

所以我做的第一件事就是查询我想要显示的表格,所以如果我想要有许多类别的博客,我会查询博客。如果我想要有许多博客的类别我查询类别。

接下来,我在联结表中查询关系。由于我在博客表中,我与blog_id进行比较,以找到我需要的类别ID。最后,我在id上运行一个连接,然后选择我想要显示的列。