我正在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。
嗯,您提到一种可以实现的方式……至少,更紧凑了吗?这并不总是最好的,但有时我发现它使您更有可能完全限定列名,更全面,等等。
每次提到一个表时,都可以给它一个别名。这可能会给您留下类似的东西:
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)
或一些易于搜索的名称。