點燈坊

失くすものさえない今が強くなるチャンスよ

Apollo GraphQL 與 Knex Where 精簡寫法

Sam Xiao's Avatar 2021-10-22

Knex 的 where 能接受 Object Literal,若配合 ECMAScript 2015 的 Property Shorthand,則有更精簡寫法。

Version

Apollo GraphQL 2.9.6
Knex 0.20.10

SQL

SELECT *
FROM books
WHERE id = 1
  AND title = 'FP in JavaScript'
  AND price = 100

根據 idtitleprice 查詢結果。

Apollo GraphQL

import { ApolloServer, gql } from 'apollo-server'
import knex from 'knex'

let mySQL = knex ({
  client:'mysql',
  connection:{
    host:process.env.MYSQL_HOST || 'localhost',
    port:process.env.MYSQL_PORT || 3306,
    user:'root',
    password:process.env.MYSQL_ROOT_PASSWORD || 'demo',
    database:'Bookshelf'
  }
})

let typeDefs = gql`
  type Query {
    books(id: Int title: String! price: Int): [Book]
  }

  type Book {
    id: Int
    title: String
    price: Int
  }
`

let books = (_, { id, title, price }) => mySQL ('books')
  .select ('*')
  .where ('id', id)
  .andWhere ('title', title)
  .andWhere ('price', price)

let resolvers = {
  Query:{
    books
  }
}

let apolloServer = new ApolloServer ({ typeDefs, resolvers })

apolloServer.listen ()
  .then (({ url }) => `GraphQL Server ready at ${ url }`)
  .then (console.log)

27 行

let books = (_, { id, title, price }) => mySQL ('books')
  .select ('*')
  .where ('id', id)
  .andWhere ('title', title)
  .andWhere ('price', price)

可在 books query 提供 idtitleprice argument,並搭配 Knex 的 whereandWhere,剛好也對應原本 SQL。

let books = (_, { id, title, price }) => mySQL ('books')
  .select ('*')
  .where ({
    'id': id,
    'title': title,
    'price': price
  })

對於一般常用的 =,Knex 允許我們直接對 Object 傳入 Object Literal,可讀性更佳。

let books = (_, { id, title, price }) => mySQL ('books')
  .select ('*')
  .where ({ id, title, price })

若將 query 的 argument 特別取的與 field 相同,藉由 ES6 的 property shorthand,則有更精簡寫法。

where000

Conclusion

  • 其實原本 where + Object Literal 寫法其實可讀性已經很高,但藉由 ES6 的 property shorthand,則有更精簡寫法

Reference

Knex, where