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
根據 id
、title
與 price
查詢結果。
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 提供 id
、title
與 price
argument,並搭配 Knex 的 where
與 andWhere
,剛好也對應原本 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,則有更精簡寫法。
Conclusion
- 其實原本
where
+ Object Literal 寫法其實可讀性已經很高,但藉由 ES6 的 property shorthand,則有更精簡寫法