Knex使用一组变量进行SELECT,另一组变量进行JOIN

问题描述 投票:0回答:1

我正在Knex中构建数据库查询。联接和过滤按我想要的方式工作,并且我使用.select()函数来避免用最新的联接覆盖ID变量。

但是,我不确定这段代码是否可以做到。我不喜欢选择一个名称的列,而是使用原始名称进行联接。

有什么方法可以使我变得更清晰更清晰?

    return db('user_cards')
        .select([ 'user_cards.id as user_cards_id', 'user_cards.user_id', 'user_cards.card_id', 'user_cards.unix_timestamp',
            'cards.id as card_id', 'cards.question as card_question', 'cards.answer as card_answer', 'cards.lecture_segment_id as lecture_segment_id',
            'lecture_segments.id as lecture_segment_id', 'lecture_segments.lecture_id as lecture_id'
        ])
        .join('cards', 'user_cards.card_id', 'cards.id')
        .join('lecture_segments', 'cards.lecture_segment_id', 'lecture_segments.id')
        .where('user_id', user_id)
        .where('lecture_id', lecture_id)

详细信息:

该产品是一种抽认卡应用,其中,抽认卡与用户,讲座细分和整体讲座相关联。

在查询中,我正在访问这些数据库:

User_Cards,具有用于user_id和card_id的FK卡片,具有FK的讲课IDLecture_Segment_Id,其中有一个FK的演讲者ID。

knex.js database-normalization
1个回答
0
投票

嗯,您提到一种可以实现的方式……至少,更紧凑了吗?这并不总是最好的,但有时我发现它使您更有可能完全限定列名,更全面,等等。

每次提到一个表时,都可以给它一个别名。这可能会给您留下类似的东西:

db("user_cards.as uc")
  .select([
    "uc.id as uc.id",
    "uc.user_id",
    "uc.card_id",
    "uc.unix_timestamp",
    "c.id as card_id",
    "c.question as card_question",
    "c.answer as card_answer",
    "c.lecture_segment_id as lecture_segment_id",
    "ls.id as lecture_segment_id",
    "ls.lecture_id as lecture_id"
  ])
  .join("cards as c", "uc.card_id", "c.id")
  .join("lecture_segments.as ls", "c.lecture_segment_id", "ls.id")
  .where("uc.user_id", user_id)
  .andWhere("uc.lecture_id", lecture_id);

您需要判断这是否更具可读性/可维护性。

您可以考虑的另一种实践:在单独的变量(或根据当前状态生成列表的函数)中维护列的列表:

db("user_cards as uc").select(FLASHCARD_MAIN_VIEW_REQUIREMENTS)

或一些易于搜索的名称。

© www.soinside.com 2019 - 2024. All rights reserved.