GraphQLのクエリは、Amplify pushによって自動生成されます。そのまま使うことも可能ですが、いろいろな利用シーンで不都合が生じる場合があります。不都合を解消するために、クエリをカスタマイズして利用する事ができます。
graphql.schemaの宣言例
############################################
# Company Infomation
############################################
type CompanyInfo @model
{
id:ID!
createdAt: String
updatedAt: String
company_name:String
users:[User] @hasMany(indexName:"byCompanyInfoID",fields:["id"])
}
############################################
# User Infomation
############################################
type User @model
{
id:ID!
createdAt: String
updatedAt: String
username: String
mailaddress: String
companyID: ID @index(name:"byCompanyInfoID",sortKeyFields:["username"],queryField:"searchUsers")
companyinfo:CompanyInfo @belongsTo(fields:["companyID"])
}
生成されたquery.js(一部抜粋)では
export const searchUsers = /* GraphQL */ `
query SearchUsers(
$companyID: ID!
$username: ModelStringKeyConditionInput
$sortDirection: ModelSortDirection
$filter: ModelUserFilterInput
$limit: Int
$nextToken: String
) {
searchUsers(
companyID: $companyID
username: $username
sortDirection: $sortDirection
filter: $filter
limit: $limit
nextToken: $nextToken
) {
items {
id
createdAt
updatedAt
username
mailaddress
companyID
}
nextToken
}
}
`;
ユーザー名で検索するクエリですが、このまま利用すると、CompanyInfoを取得できません。companyIDを利用して別クエリを発行する必要が出てきます。そこで、以下の様にカスタマイズすることで、1度の発行でCompanyInfoを取得することができます。
const searchUsers = /* GraphQL */ `
query SearchUsers(
$companyID: ID!
$username: ModelStringKeyConditionInput
$sortDirection: ModelSortDirection
$filter: ModelUserFilterInput
$limit: Int
$nextToken: String
) {
searchUsers(
companyID: $companyID
username: $username
sortDirection: $sortDirection
filter: $filter
limit: $limit
nextToken: $nextToken
) {
items {
id
createdAt
updatedAt
username
mailaddress
companyID
companyinfo{
company_name
}
}
nextToken
}
}
`;
今回は、簡単な例ですが、さらにカスタマイズが可能になります(つづきは後日)
(記事のお問合せ・無料相談 → こちら)