# fetch
The fetch
action is for loading data from the GraphQL API into your Vuex-Store.
# Fetching all records
The simplest way to call the fetch method is without any arguments. This will query all records from the GraphQL API:
await Comment.fetch();
// or
await Comment.dispatch('fetch')
This produces the following GraphQL query:
query Comments {
comments {
nodes {
id
content
postId
userId
user {
id
email
}
post {
id
content
title
user {
id
email
}
}
}
}
}
When you look in the store after a fetch, you'll find that there is the comment, comment author user, post and posts author user loaded.
So using the regular Vuex-ORM getters should work out of the box now:
const comments = Comment.query().withAll().all();
When fetching all returned records replace the respective existing records in the Vuex-ORM database.
# Fetching a single record
You can also fetch single records via ID:
await Comment.fetch('42');
// or
await Comment.fetch({ id: '42' });
// or
await Comment.dispatch('fetch', { filter: { id: '42' }})
It automatically recognizes, that you're requesting a single record and sends a GraphQL Query for a single record:
query Comment($id: ID!) {
comment(id: $id) {
id
content
postId
userId
user {
id
email
}
post {
id
content
title
user {
id
email
}
}
}
}
# Filtering
Additionally you can pass a filter object to the fetch action like this:
await Comment.fetch({ postId: '15', deleted: false });
// or
await Comment.dispatch('fetch', { filter: { postId: '15', deleted: false }})
This will generate the following GraphQL query:
query Comments($postId: ID!, $deleted: Boolean!) {
comments(filter: { postId: $postId, deleted: $deleted }) {
nodes {
id
content
postId
userId
user {
id
email
}
post {
id
content
title
user {
id
email
}
}
}
}
}
# Usage with vue-router
When you use vue-router, you should call your fetch actions in the page component after the navigation. Also we highly recommend the usage of async/await.
<template>
<div class="post" v-if="post">
<h1>{{ post.title }}</h1>
<p>{{ post.body }}</p>
</div>
</template>
<script>
export default {
// Use a computed property for the component state to keep it reactive
computed: {
post: () => Post.find('1')
},
created () {
// fetch the data when the view is created and the data is
// already being observed
this.fetchData();
},
watch: {
// call again the method if the route changes
'$route': 'fetchData'
},
methods: {
// Loads the data from the server and stores them in the Vuex Store.
async fetchData () {
await Post.fetch({ filter: { id: this.$route.params.id }});
}
}
}
</script>
# Caching
The plugin caches same queries. To bypass caching set the second param of the fetch
action to true
when using the convenience method or add bypassCache: true
to the arguments of the dispatch()
call
await Comment.fetch({ id: '42' }, true );
// Or
await Comment.dispatch('fetch', { filter: { id: '42' }, bypassCache: true })